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";
?>
Спасибо всем за исчерпывающие ответы. Все это очень полезно. Ответ оказался очень странным. Оказывается, PHP 5.2.11 не нравится следующее:
post_max_size = 2G
или
post_max_size = 2048M
Если я изменю его на 2047M
, загрузка будет работать.
Вот контрольный список для загрузки файлов в PHP:
Проверьте php.ini на:
file_uploads = On
post_max_size = 100M
upload_max_filesize = 100M
.htaccess
или .user.ini
, если вы находитесь на виртуальном хостинге и у вас нет доступа к php.ini
. phpinfo()
для проверки вашего
настройки действительно применяются. 100M
, а не 100MB
. Убедитесь, что ваш тег имеет атрибут
enctype="multipart/form-data"
. Никакой другой тег не будет работать, это должен быть ваш тег FORM. Дважды проверьте правильность написания. Дважды проверьте, что multipart/form-data окружены ПРЯМЫМИ КАТЫКАМИ, а не умными кавычками, вставленными из Word ИЛИ из блога веб-сайта (WordPress преобразует прямые кавычки в угловые кавычки!). Если у вас есть несколько форм на странице, убедитесь, что они обе имеют этот атрибут. Введите их вручную или попробуйте ввести прямые одинарные кавычки вручную.
Убедитесь, что у вас нет двух полей входного файла с одинаковым атрибутом имя
. Если вам нужно поддерживать несколько, поставьте квадратные скобки в конце имени:
Убедитесь, что для каталогов tmp и upload установлены правильные разрешения на чтение и запись. Временная папка загрузки указана в настройках PHP как upload_tmp_dir
.
Убедитесь, что место назначения файла и каталоги tmp/upload не иметь пробелы в них.
Убедитесь, что все на вашей странице имеют закрывающие теги
.
Убедитесь, что ваш тег FORM имеет method="POST"
. Запросы GET не поддерживают загрузку multipart/form-data.
Убедитесь, что тег ввода файла имеет атрибут NAME. Атрибута ID НЕ достаточно! Атрибуты ID предназначены для использования в DOM, а не для полезных данных POST.
Убедитесь, что вы не используете Javascript, чтобы отключить поле при отправке.
Убедитесь, что вы не вкладываете формы, такие как
Проверьте структуру HTML на наличие недопустимых/перекрывающихся тегов, таких как
Также убедитесь, что файл в загружаемом файле нет никаких буквенно-цифровых символов.
Однажды я часами пытался понять, почему это вдруг произошло со мной. Оказалось, что я изменил некоторые настройки PHP в .htaccess
, и один из них (пока не уверен, какой именно) вызывал сбой загрузки и $_FILES
был пустым. .
Вы могли бы попытаться избежать подчеркивания (_
) в атрибуте name=""
тега
Попробуйте загрузить очень маленький файлы, чтобы сузить вопрос, связана ли проблема с размером файла.
Проверьте доступное место на диске.Хотя это встречается очень редко, это упоминается в этом комментарии к странице руководства по PHP:
Если массив $_FILES вдруг загадочным образом становится пустым, даже если ваша форма кажется правильной, вам следует проверить место на диске, доступное для вашего временного файла. раздел папки. В моей установке все загрузки файлов завершились неудачно без предупреждения. После долгого скрежета зубов я попытался освободить дополнительное место, после чего загрузка файлов снова заработала.
Убедитесь, что вы не отправляете форму через запрос POST AJAX, а не через обычный запрос POST, который вызывает перезагрузку страницы. Я просмотрел каждый пункт в приведенном выше списке и, наконец, обнаружил, что причина, по которой моя переменная $_FILES была пустой, заключалась в том, что я отправлял форму с использованием запроса AJAX POST. Я знаю, что есть методы для загрузки файлов с помощью ajax, но это может быть веской причиной того, что ваш массив $_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
?