Почему $ _FILES пуст при загрузке файлов на PHP?

У меня есть WampServer 2, установленный на моем компьютере с Windows 7. Я использую 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"; ?> 

Solutions Collecting From Web of "Почему $ _FILES пуст при загрузке файлов на PHP?"

Вот контрольный список для загрузки файлов в 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> имеет enctype="multipart/form-data" . Никакой другой тег не будет работать, он должен быть вашим тегом FORM. Дважды проверьте правильность написания . Дважды проверьте, что multipart / form-data окружены STRAIGHT QUOTES, а не умные кавычки, вставленные из 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 НЕ достаточен! Идентификаторы атрибутов предназначены для использования в 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 Manual :

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

Источник для некоторых из этих пунктов:
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 , загрузка будет работать.

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

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

Примечание : max_file_uploads НЕ МОЖЕТ быть изменен вне php.ini. См. PHP «Ошибка» # 50684

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

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

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

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

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

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

Убедитесь, что ваш элемент ввода имеет атрибут «имя». <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 выше 20 20mb но массив равен null . Ответ: наш post_max_size должен быть больше, чем upload_max_filesize

 post_max_size = 750M upload_max_filesize = 750M 

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

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

и просто используя:

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

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

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

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

 /var/log/apache2/error.log 

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

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

У меня была схожая проблема, и проблема была ошибочной в htaccess, как упоминалось в shamittomar.

Изменить php_value post_max_size 10MB на php_value post_max_size 10M

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

 </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. В приведенном выше контрольном списке не упоминаются MultiViews в .htaccess, httpd.conf или httpd-vhost.conf.

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

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

Использование многочастной формы с вводом файла не поддерживается Ajax. В этом случае вы должны украсить родительскую форму data-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> 

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

Отключение этой опции заставляет $ _POST и $ _FILES не заполняться . Единственный способ прочитать postdata будет затем через фреймворк потока php: //. (…)

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

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