Почему $ _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 ]

2 голосов
/ 18 июля 2017

Проверьте ваш php.ini на enable_post_data_reading = On , потому что:

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

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

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

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

1 голос
/ 26 января 2017

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

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

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

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

работал просто отлично. Моя установка - ПК / Windows 10 / WAMPSERVER 3.0.6 64bit

0 голосов
/ 22 мая 2017

Если вы используете 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>
0 голосов
/ 16 мая 2013

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

0 голосов
/ 31 августа 2015

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

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

0 голосов
/ 16 сентября 2014

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

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

0 голосов
/ 12 марта 2014

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

0 голосов
/ 29 мая 2019

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

Вот еще одна вещь, которую нужно проверить, которая еще не упоминалась ...

Естественно, я предположил, что папка, в которой мой PHP-скрипт хранил временные загрузки файлов, была /tmp.Эта вера была подкреплена тем фактом, что echo sys_get_temp_dir() . PHP_EOL; возвращает /tmp.Кроме того, echo ini_get('upload_tmp_dir'); ничего не возвращает.

Чтобы убедиться, что загруженный файл действительно ненадолго появляется в моей папке /tmp, я добавил оператор sleep(30); в свой сценарий (как предложено здесь ) и переместился в мою папку /tmp в диспетчере файлов cPanel, чтобы найти файл.Однако, несмотря ни на что, загруженный файл нигде не был найден.

Я потратил часы, пытаясь определить причину этого, и реализовал каждое предложение, которое было предложено здесь.

Наконец,после поиска файлов моего веб-сайта по запросу tmp я обнаружил, что мой сайт содержит другие папки с именем tmp в разных каталогах.Я понял, что мой PHP-скрипт фактически записывал загруженные файлы в .cagefs/tmp. (для просмотра этой папки в cPanel должна быть включена настройка «Показать скрытые файлы» ).

Итак, почему функция sys_get_temp_dir возвращает неточную информацию?

Вот объяснение с веб-страницы PHP.net для sys_get_temp_dir (т. Е. Верхний комментарий):

Если работает в системе Linux, где systemdимеет PrivateTmp = true (который используется по умолчанию в CentOS 7 и, возможно, в других новых дистрибутивах), эта функция просто возвращает "/ tmp", а не истинный, гораздо более длинный, несколько динамический путь.

ЭтоТАК сообщение также углубляется в проблему:

0 голосов
/ 22 марта 2015

Я был пуст $_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>
...