Почему $ FILES должны быть пустыми при загрузке файлов на PHP?



у меня установлен WampServer 2 на моем компьютере с Windows 7. Я использую Apache 2.2.11 и PHP 5.2.11. Когда я пытаюсь загрузить любой файл из формы, он, кажется, загружается, но в PHP,$_FILES массив пуст. Там нет файла в . Я настроил php.ini разрешить загрузку файлов и тому подобное. Элемент tmp папка имеет права на чтение / запись для текущего пользователя. Я ковылявший.



HTML:



<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form enctype="multipart/form-data" action="vanilla-upload.php" method="POST">
Choose a file to upload: <input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>


PHP:



<?php
echo 'file count=', count($_FILES),"n";
var_dump($_FILES);
echo "n";
?>
619   20  

20 ответов:

вот контрольный список для загрузки файлов в PHP:

  1. Проверьте php.ini для:
    file_uploads = On
    post_max_size = 100M
    upload_max_filesize = 100M

    • возможно, Вам придется использовать .htaccess или .user.ini если вы находитесь на виртуальном хостинге и не имеет доступа к php.ini.
    • убедитесь, что вы редактируете правильный ini файл – используйте phpinfo() функция для проверки настройки фактически применяются.
    • также убедитесь, Вы не опечатка размеров-это должно быть 100Mне100MB.
  2. убедитесь, что ваш <form> тега . Никакой другой тег не будет работать, это должен быть ваш тег формы. Дважды проверьте, что это правильно. Дважды проверьте, что multipart/form-data окружен прямыми кавычками, а не умными кавычками, вставленными из Word или из блога веб-сайта (WordPress преобразует прямые кавычки в угловые кавычки!). Если вы есть несколько форм на странице, убедитесь, что они оба имеют этот атрибут. Введите их вручную или попробуйте ввести прямые одинарные кавычки вручную.

  3. убедитесь, что у вас нет двух полей входного файла с одинаковым . Если вам нужно поддерживать несколько, поставить квадратные скобки в конце:

    <input type="file" name="files[]">
    <input type="file" name="files[]">
    
  4. убедитесь, что ваши каталоги tmp и upload имеют правильные разрешения на чтение и запись. Времянка папка Загрузки задается в настройках PHP как upload_tmp_dir.

  5. убедитесь, что ваш файл назначения и tmp/загрузить каталоги не есть места в них.

  6. убедитесь, что все <form>'s на Вашей странице </form> закрыть теги.

  7. убедитесь, что ваш тег формы method="POST". Запросы GET не поддерживают загрузку данных из нескольких частей / форм.

  8. убедитесь, что тег ввода файла имеет имя атрибут. Атрибут ID не является достаточным! Атрибуты ID предназначены для использования в DOM, а не для почтовых полезных нагрузок.

  9. убедитесь, что вы не используете Javascript для отключения <input type="file"> поле при подаче

  10. убедитесь, что вы не вложенность формы, как <form><form></form></form>

  11. Проверьте структуру HTML на наличие недопустимых / перекрывающихся тегов, таких как <div><form></div></form>

  12. также убедитесь, что файл, который вы загрузка не содержит никаких не буквенно-цифровых символов.

  13. однажды я просто потратил несколько часов, пытаясь понять, почему это случилось со мной внезапно. Оказалось, что я изменил некоторые настройки PHP в .htaccess, и один из них (не уверен, что еще) вызывал сбой загрузки и $_FILES чтобы быть пустым.

  14. вы можете попытаться избежать подчеркивания (_) в на <input> тег

  15. попробуйте загрузить очень маленькие файлы, чтобы сузить ли это проблема размера файла.

  16. Проверьте доступное дисковое пространство. Хотя и очень редко, он упоминается в этой комментарий к странице руководства PHP:

    если массив $_FILES внезапно становится загадочно пустым, даже если ваша форма кажется правильной, вы должны проверить дисковое пространство, доступное для вашего временного раздела папки. В моем установка, все загрузки файлов не удалось без предупреждения. После долгого скрежета зубов я попытался освободить дополнительное пространство, после чего загрузка файлов внезапно снова сработала.

источник для некоторых из них points:
http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/

насколько HTML вы, кажется, правильно настроили эту часть. У вас уже есть enctype="multipart/form-data" что очень важно иметь в форме.

как php.ini настройка, иногда на несколько систем php.ini файлы существуют. Убедитесь, что вы редактируете правильный. Я знаю, что вы сказали, что вы настроили свой php.ini файл для загрузки файлов, но вы также установили свой upload_max_filesize и post_max_size чтобы быть больше, чем файл, который вы пытаетесь загрузить? Так что вы должны есть:

file_uploads = On; sounds like you already did this
post_max_size = 8M; change this higher if needed
upload_max_filesize = 8M; change this higher if needed

ваш каталог: "c:\wamp\tmp" есть разрешения на чтение и запись? Ты не забыл перезапустить Apache после того как вы сделали php.ini изменения?


важно добавить enctype="multipart/form-data" к вашей форме, пример

<form action="upload.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
</form>

спасибо всем за разнообразные исчерпывающие ответы. Все это очень полезно. Ответ оказался очень странным. Оказывается, PHP 5.2.11 не нравится следующее:

post_max_size = 2G

или

post_max_size = 2048M

Если я изменю его на 2047M загрузка работает.

убедитесь, что ваш form имеет следующие атрибуты enctype="multipart/form-data".

вот еще одна причина, которую я нашел: При использовании JQuery Mobile и атрибут формы data-ajax имеет значение true, массив файлов будет пустым. Поэтому установите data-ajax в false.

убедитесь, что ваш входной элемент имеет атрибут 'name'. <input type="file" name="uploadedfile" />

Если это отсутствует $_FILES будет пустым.

у меня такая же проблема ,глядя на 2 часа, очень просто, чтобы мы сначала проверили нашу конфигурацию сервера.

пример:

echo $upload_max_size = ini_get('upload_max_filesize');  
echo $post_max_size=ini_get('post_max_size');   

любой тип размера файла :20mb, но наши upload_max_size выше 20mb но массив null. Ответ: наш!--6--> должно быть больше upload_max_filesize

post_max_size = 750M  
upload_max_filesize = 750M

Я боролся с той же проблемой и тестировал все, не получая отчетов об ошибках, и ничего не казалось неправильным. У меня была error_reporting(E_ALL) Но вдруг я понял, что не проверил журнал apache и вуаля! В скрипте произошла синтаксическая ошибка...! (отсутствует "}")

Итак, даже если это что-то очевидное для проверки, это можно забыть... В моем случае (linux) он находится по адресу:

/var/log/apache2/error.log

если вы пытаетесь загрузить массив файлов, то вам может понадобиться, чтобы увеличить max_file_uploads на php.ini который по умолчанию установлен в 20

Примечание:max_file_uploads не может быть изменен за пределами php.Ини. Смотрите PHP "ошибка" #50684

еще один возможный виновник-перенаправление apache. В моем случае у меня был httpd apache.conf настроен на перенаправление определенных страниц на нашем сайте в http-версии, а других страниц-в https-версии страницы, если они еще не были. Страница, на которой у меня была форма с вводом файла, была одной из страниц, настроенных для принудительного ssl, но страница, назначенная как действие формы, была настроена на http. Таким образом, страница отправит загрузку на версию ssl страницы действия, но apache был перенаправление его на http-версию страницы и данные post, включая загруженный файл, были потеряны.

никто не упоминал об этом, но это помогло мне, и не многие места в сети упоминают об этом.

убедитесь, что ваш PHP.ini устанавливает следующий ключ:

    upload_tmp_dir="/path/to/some/tmp/folder"

вам нужно будет проверить с вашим веб-хостом, если они хотят, чтобы вы использовали абсолютный путь к файлу сервера. Вы должны иметь возможность видеть другие примеры каталогов в вашем php.файл ini, чтобы определить это. Как только я установил его, я получил значения в моем _FILES объекта.

наконец убедитесь, что ваша папка tmp и где бы то ни было вы перемещаете файлы, чтобы иметь правильные разрешения, чтобы их можно было читать и записывать.

я столкнулся с той же проблемой и обнаружил, что это моя IDE была частью проблемы. Я запускал отладчик непосредственно из IDE (PHPStorm) вместо того, чтобы просто использовать браузер напрямую. IDE породил URL-адрес был следующим:

"...localhost:63342/CB_Upload/index.php?_ijt=j2hcbacqepj87bvg66ncuohvne"

и просто использовать:

"...localhost/CB_Upload/index.php"

работала просто отлично. Моя настройка-PC / Windows 10 / WAMPSERVER 3.0.6 64bit

проверьте свой php.ini для enable_post_data_reading=On потому что:

отключение этой опции приводит к тому, что $_POST и $_FILES не заполняются. Единственный способ прочитать postdata будет тогда через PHP: / / input stream wrapper. (... )

In http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading

Я получил ту же проблему, и ни одна из тем не была моей ошибкой. Проверьте в вашем .htaccess файл, если у вас есть один, если "MultiViews" включены. Мне пришлось их отключить.

если ваш основной скрипт http://Some_long_URL/index.php будьте осторожны, чтобы указать полный URL (с явным index.php и не только http://Some_long_URL) в action поле. Удивительно, но если нет, то выполняется правильный скрипт, но с пустыми $_FILES !

у меня была аналогичная проблема, и проблема была в неправильном значении в htaccess, как упоминал шамиттомар.

изменить php_value post_max_size 10MB до php_value post_max_size 10M

Я был пуст $_FILES потому что после <form enctype="multipart/form-data" method="post"> я поставил

</div>
<div style="clear:both"></div>

исходный код был как

<span class="span_left">Photos (gif/jpg/jpeg/png) </span>
<form enctype="multipart/form-data" method="post">
<input name="files[]" type="file" id="upload_file" />
<input type="button" id="upload" value="Upload photo" />
</form>

я решил изменить и

<div>
<span class="span_left">Photos (gif/jpg/jpeg/png) </span>
<form enctype="multipart/form-data" method="post">
</div>
<div style="clear:both"></div>
<input name="files[]" type="file" id="upload_file" />
<input type="button" id="upload" value="Upload photo" />
</form>
<div style="clear:both"></div>

Итак, вывод таков, что после <form enctype="multipart/form-data" method="post"> должно быть <input name, type, id и не должно быть <div> или некоторые другие теги

в моей ситуации правильный код

<div>
<span class="span_left">Photos (gif/jpg/jpeg/png) </span>
</div>
<div style="clear:both"></div>
<form enctype="multipart/form-data" method="post">
<input name="files[]" type="file" id="upload_file" />
<input type="button" id="upload" value="Upload photo" />
</form>
<div style="clear:both"></div>

У меня тоже были проблемы с $ _FILES пустой. В приведенном выше контрольном списке не упоминаются мультивизы .htaccess, httpd.conf или httpd-vhost.конф.

Если у вас есть MultiViews, установленные в директиве options для вашего каталога, содержащего веб-сайт, $_FILES будет пустым, даже если заголовок Content-Length показывает, что файл, который я загрузил.

Если вы используете jQuery Mobile

использование составной формы с файловым вводом не поддерживается Ajax. В этом случае вы должны украсить родительскую форму данными-ajax="false", чтобы обеспечить правильную отправку формы на сервер.

<form action="upload.php" method="post" enctype="multipart/form-data"  data-ajax="false">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
</form>

Comments

    Ничего не найдено.