Почему $ _FILES будет пустым при загрузке файлов в PHP? - PullRequest
126 голосов
/ 27 августа 2010

У меня на компьютере с Windows 7 установлен WampServer 2.Я использую Apache 2.2.11 и PHP 5.2.11.Когда я пытаюсь загрузить любой файл из формы, кажется, что он загружается, но в PHP массив $_FILES пуст.В папке c:\wamp\tmp нет файла.Я настроил 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";
?>

Ответы [ 20 ]

434 голосов
/ 27 августа 2010

Вот контрольный список для загрузки файлов в 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. Makeубедитесь, что ваш тег <form> имеет атрибут enctype="multipart/form-data".Никакой другой тег не будет работать, это должен быть ваш тег FORM.Дважды проверьте правильность написания .Дважды проверьте, что multipart / form-data окружены прямыми цитатами, а не умными цитатами, вставленными из Word OR из блога веб-сайта (WordPress преобразует прямые кавычки в угловые кавычки!).Если у вас есть несколько форм на странице, убедитесь, что у них обоих есть этот атрибут.Введите их вручную или попробуйте ввести одинарные кавычки, введенные вручную.

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

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

  5. Убедитесь, что в папках назначения файлов и tmp / upload нет пробелов.

  6. Убедитесь, что все <form> на вашей странице имеют </form> закрывающих тегов.

  7. Убедитесь, что ваш тег FORM имеет method="POST".GET-запросы не поддерживают загрузку данных multipart / form-data.

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

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

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

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

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

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

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

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

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

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

  17. Убедитесь, что вы не отправляете форму через AJAX POSTзапрос вместо обычного запроса POST, который вызывает перезагрузку страницы.Я прошел все пункты списка выше и, наконец, обнаружил, что причина, по которой моя переменная $ _FILES была пустой, заключалась в том, что я отправлял форму с помощью запроса AJAX POST.Я знаю, что существуют методы для загрузки файлов с использованием ajax, но это может быть веской причиной, по которой ваш массив $ _FILES пуст.

Источник некоторых из этих пунктов:
http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/

72 голосов
/ 27 августа 2010

Насколько вам кажется, 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 изменений?


30 голосов
/ 28 марта 2016

Важно добавить 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>
14 голосов
/ 29 августа 2010

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

post_max_size = 2G

или

post_max_size = 2048M

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

6 голосов
/ 15 октября 2014

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

5 голосов
/ 11 февраля 2015

У меня та же проблема с поиском 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.Ответ наш post_max_size должен быть больше upload_max_filesize

post_max_size = 750M  
upload_max_filesize = 750M
3 голосов
/ 18 июня 2015

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

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

/var/log/apache2/error.log
3 голосов
/ 18 декабря 2015

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

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

2 голосов
/ 09 апреля 2015

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

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

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

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

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

2 голосов
/ 15 августа 2013

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

Примечание : max_file_uploads НЕ может быть изменено вне php.ini. Смотрите PHP "Ошибка" # 50684

...