У меня на компьютере с 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";
?>
php
apache
file-upload
elmonty
источник
источник
vanilla-upload.php
?Ответы:
Вот контрольный список для загрузки файлов в PHP:
Проверьте php.ini для:
file_uploads = On
post_max_size = 100M
upload_max_filesize = 100M
.htaccess
или.user.ini
если вы находитесь на общем хостинге и не имеете доступа кphp.ini
.phpinfo()
функцию, чтобы убедиться, что ваши настройки действительно применяются.100M
не100MB
.Убедитесь, что ваш
<form>
тег имеетenctype="multipart/form-data"
атрибут. Никакой другой тег не будет работать, это должен быть ваш тег FORM. Дважды проверьте, что оно написано правильно . Дважды проверьте, что multipart / form-data окружены прямыми цитатами, а не умными цитатами, вставленными из Word OR из блога веб-сайта (WordPress преобразует прямые цитаты в угловые кавычки!). Если у вас есть несколько форм на странице, убедитесь, что у них обоих есть этот атрибут. Введите их вручную или попробуйте ввести одинарные кавычки вручную.Убедитесь, что у вас нет двух полей входного файла с одним и тем же
name
атрибутом. Если вам нужно поддерживать несколько, поставьте квадратные скобки в конце имени:Убедитесь, что в ваших каталогах tmp и upload установлены правильные разрешения на чтение и запись. Временная папка загрузки указана в настройках PHP как
upload_tmp_dir
.Убедитесь, что в вашем каталоге назначения и каталогах tmp / upload нет пробелов.
Убедитесь, что все
<form>
на вашей странице имеют</form>
закрывающие теги.Убедитесь, что ваш тэг FORM имеет
method="POST"
. GET-запросы не поддерживают загрузку данных multipart / form-data.Убедитесь, что ваш тег ввода файла имеет атрибут NAME. Атрибут ID НЕ является достаточным! Атрибуты ID предназначены для использования в DOM, а не для полезных нагрузок POST.
Убедитесь, что вы не используете Javascript для отключения своего
<input type="file">
поля при отправкеУбедитесь, что вы не вкладываете формы, такие как
<form><form></form></form>
Проверьте структуру HTML на наличие недопустимых / перекрывающихся тегов, таких как
<div><form></div></form>
Также убедитесь, что в загружаемом файле нет никаких буквенно-цифровых символов.
Однажды я просто часами пытался понять, почему это случилось со мной внезапно. Оказалось, что я изменил некоторые настройки PHP
.htaccess
, и одна из них (не знаю, какая именно) вызывала сбой загрузки и$_FILES
была пустой.Вы можете попытаться избежать подчеркивания (
_
) вname=""
атрибуте<input>
тегаПопробуйте загрузить очень маленькие файлы, чтобы определить, является ли это проблемой размера файла.
Проверьте свободное место на диске. Хотя это очень редко, это упоминается в этом комментарии к странице PHP Manual :
Убедитесь, что вы не отправляете форму с помощью AJAX POST-запроса вместо обычного POST-запроса, который приводит к перезагрузке страницы. Я просмотрел все пункты в приведенном выше списке и, наконец, обнаружил, что причина, по которой моя переменная $ _FILES была пустой, заключалась в том, что я отправлял форму с помощью запроса AJAX POST. Я знаю, что существуют методы для загрузки файлов с использованием ajax, но это может быть веской причиной, по которой ваш массив $ _FILES пуст.
Источник для некоторых из этих пунктов:
http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/
источник
<form><form><input type="file"></form></form>
$('#my-form')[0].reset();
в обработчике отправки.Что касается HTML, вы, кажется, правильно настроили эту часть. У вас уже есть то,
enctype="multipart/form-data"
что очень важно иметь в форме.Что касается вашей
php.ini
настройки, иногда в системахphp.ini
существует несколько файлов. Убедитесь, что вы редактируете правильный. Я знаю, что вы сказали, что настроили свойphp.ini
файл для загрузки файлов, но вы также установили егоupload_max_filesize
и онpost_max_size
будет больше, чем файл, который вы пытаетесь загрузить? Итак, вы должны иметь:Имеет ли ваша директория
"c:\wamp\tmp"
права на чтение и запись? Вы помните, чтобы перезапустить Apache послеphp.ini
внесения изменений?источник
Важно добавить
enctype="multipart/form-data"
в вашу форму примеристочник
Спасибо всем за разнообразные исчерпывающие ответы. Это все очень полезно. Ответ оказался чем-то очень странным. Оказывается, PHP 5.2.11 не нравится следующее:
или
Если я изменю это на
2047M
, загрузка работает.источник
У меня та же проблема с поиском 2 часа, очень просто, чтобы мы сначала проверили конфигурацию нашего сервера.
Пример:
любой тип размера файла
:20mb
, но нашupload_max_size
выше,20mb
но массивnull
. Ответ нашpost_max_size
должен быть больше, чемupload_max_filesize
источник
Вот еще одна причина, которую я обнаружил: при использовании JQuery Mobile и атрибуте data-ajax формы устанавливается в значение true, массив FILES будет пустым. Так что установите data-ajax в false.
источник
Убедитесь, что ваш входной элемент имеет атрибут name.
<input type="file" name="uploadedfile" />
Если это отсутствует, $ _FILES будет пустым.
источник
Я боролся с той же проблемой и все тестировал, не получал сообщений об ошибках, и, похоже, все было в порядке. У меня был error_reporting (E_ALL), но внезапно я понял, что я не проверил журнал apache и вуаля! Произошла синтаксическая ошибка в сценарии ...! (отсутствует "}")
Таким образом, хотя это и нужно проверить, это можно забыть ... В моем случае (linux) оно находится по адресу:
источник
Никто не упомянул об этом, но это помогло мне, и не многие места в сети упоминают об этом.
Убедитесь, что ваш php.ini устанавливает следующий ключ:
Вам нужно будет проверить у своего веб-хоста, хотят ли они, чтобы вы использовали абсолютный путь к файлу сервера. Вы должны быть в состоянии увидеть другие примеры каталогов в вашем файле php.ini, чтобы определить это. Как только я установил его, я получил значения в своем объекте _FILES.
Наконец, убедитесь, что ваша папка tmp и куда бы вы ни перемещали файлы, должны иметь правильные разрешения, чтобы их можно было читать и записывать.
источник
Если вы пытаетесь загрузить массив файлов , то вам , возможно , придется увеличить
max_file_uploads
вphp.ini
который по умолчанию задано20
Примечание :
max_file_uploads
НЕ может быть изменено за пределами php.ini. Смотрите PHP "Ошибка" # 50684источник
Другой возможный виновник - перенаправление apache. В моем случае у меня был настроен apache httpd.conf для перенаправления определенных страниц нашего сайта в версии http, а другие страницы в версии https, если они еще не были. Страница, на которой у меня была форма с вводом файла, была одной из страниц, настроенных для принудительного использования ssl, но страница, обозначенная как действие формы, была настроена на http. Таким образом, страница отправляла закачку в ssl-версию страницы действия, но apache перенаправлял ее на http-версию страницы, и данные публикации, включая загруженный файл, были потеряны.
источник
Проверьте ваш php.ini на наличие enable_post_data_reading = On , потому что:
В http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading
источник
Если ваш основной сценарий
http://Some_long_URL/index.php
будет осторожен, укажите в поле полный URL (с явнымindex.php
и не толькоhttp://Some_long_URL
)action
. Удивительно, но если нет, то правильный скрипт выполняется, но с пустым $ _FILES!источник
Я столкнулся с той же проблемой и обнаружил, что именно моя IDE была частью проблемы. Я запускал отладчик прямо из IDE (PHPStorm) вместо того, чтобы просто использовать браузер напрямую. URL, созданный в IDE, был таким:
и просто используя:
работал просто отлично. Моя установка - ПК / Windows 10 / WAMPSERVER 3.0.6 64bit
источник
Не доверяйте расположению временной папки, предоставленной,
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
(т. Е. Верхний комментарий):Это ТАК сообщение о проблеме, а также:
источник
У меня та же проблема, и ни одна из тем не была моей ошибкой. Проверьте в своем файле .htaccess, если он у вас есть, включены ли «MultiViews». Я должен был отключить их.
источник
У меня была похожая проблема, и проблема была в неправильном значении в htaccess, как упоминал shamittomar.
Изменить
php_value post_max_size 10MB
наphp_value post_max_size 10M
источник
Я был пуст,
$_FILES
потому что после того, как<form enctype="multipart/form-data" method="post">
я поместилИсходный код был похож
Я решил изменить и
Таким образом, вывод заключается в том, что после
<form enctype="multipart/form-data" method="post">
должны быть<input name, type, id
и не должны быть<div>
или некоторые другие тегиВ моей ситуации правильный код был
источник
У меня тоже были проблемы с $ _FILES пустым. Приведенный выше контрольный список не упоминает MultiViews в .htaccess, httpd.conf или httpd-vhost.conf.
Если в директиве опций для вашего каталога, содержащего веб-сайт, установлены MultiView, $ _FILES будет пустым, даже если заголовок Content-Length отображает загруженный файл.
источник
Если вы используете JQuery Mobile
Использование многокомпонентной формы с вводом файла не поддерживается Ajax. В этом случае вы должны украсить родительскую форму с data-ajax = "false", чтобы форма была правильно отправлена на сервер.
источник
Отделите форму от страницы, которую вы используете, на простую страницу php, которая имеет форму и только код php, и протестируйте ее таким образом.
Любой загрузочный или Java-скрипт может очистить _FILES []. Это был мой случай
источник