Why would $_FILES be empty when uploading files to PHP?

I have WampServer 2 installed on my Windows 7 computer. I'm using Apache 2.2.11 and PHP 5.2.11. When I attempt to upload any file from a form, it seems to upload, but in PHP, the $_FILES array is empty. There is no file in the c:\wamp\tmp folder. I have configured php.ini to allow file uploads and such. The tmp folder has read/write privileges for the current user. I'm stumped.

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";
?>
133
задан Nikola K. 8 October 2012 в 20:01
поделиться

3 ответа

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

post_max_size = 2G

или

post_max_size = 2048M

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

14
ответ дан 23 November 2019 в 23:57
поделиться

Вот контрольный список для загрузки файлов в 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. Убедитесь, что ваш тег

    имеет атрибут enctype="multipart/form-data". Никакой другой тег не будет работать, это должен быть ваш тег FORM. Дважды проверьте правильность написания. Дважды проверьте, что multipart/form-data окружены ПРЯМЫМИ КАТЫКАМИ, а не умными кавычками, вставленными из Word ИЛИ из блога веб-сайта (WordPress преобразует прямые кавычки в угловые кавычки!). Если у вас есть несколько форм на странице, убедитесь, что они обе имеют этот атрибут. Введите их вручную или попробуйте ввести прямые одинарные кавычки вручную.

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

     
    
     
  4. Убедитесь, что для каталогов tmp и upload установлены правильные разрешения на чтение и запись. Временная папка загрузки указана в настройках PHP как upload_tmp_dir.

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

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

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

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

  9. Убедитесь, что вы не используете Javascript, чтобы отключить поле при отправке.

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

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

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

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

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

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

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

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

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

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

449
ответ дан 23 November 2019 в 23:57
поделиться

Что касается 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?


72
ответ дан 23 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: