Почему $ FILES должны быть пустыми при загрузке файлов на PHP?
у меня установлен WampServer 2 на моем компьютере с Windows 7. Я использую Apache 2.2.11 и PHP 5.2.11. Когда я пытаюсь загрузить любой файл из формы, он, кажется, загружается, но в PHP,$_FILES массив пуст. Там нет файла в . Я настроил 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 ответов:
вот контрольный список для загрузки файлов в PHP:
Проверьте php.ini для:
file_uploads = Onpost_max_size = 100Mupload_max_filesize = 100M
- возможно, Вам придется использовать
.htaccessили.user.iniесли вы находитесь на виртуальном хостинге и не имеет доступа кphp.ini.- убедитесь, что вы редактируете правильный ini файл – используйте
phpinfo()функция для проверки настройки фактически применяются.- также убедитесь, Вы не опечатка размеров-это должно быть
100Mне100MB.убедитесь, что ваш
<form>тега . Никакой другой тег не будет работать, это должен быть ваш тег формы. Дважды проверьте, что это правильно. Дважды проверьте, что multipart/form-data окружен прямыми кавычками, а не умными кавычками, вставленными из Word или из блога веб-сайта (WordPress преобразует прямые кавычки в угловые кавычки!). Если вы есть несколько форм на странице, убедитесь, что они оба имеют этот атрибут. Введите их вручную или попробуйте ввести прямые одинарные кавычки вручную.убедитесь, что у вас нет двух полей входного файла с одинаковым . Если вам нужно поддерживать несколько, поставить квадратные скобки в конце:
<input type="file" name="files[]"> <input type="file" name="files[]">убедитесь, что ваши каталоги tmp и upload имеют правильные разрешения на чтение и запись. Времянка папка Загрузки задается в настройках PHP как
upload_tmp_dir.убедитесь, что ваш файл назначения и tmp/загрузить каталоги не есть места в них.
убедитесь, что все
<form>'s на Вашей странице</form>закрыть теги.убедитесь, что ваш тег формы
method="POST". Запросы GET не поддерживают загрузку данных из нескольких частей / форм.убедитесь, что тег ввода файла имеет имя атрибут. Атрибут ID не является достаточным! Атрибуты ID предназначены для использования в DOM, а не для почтовых полезных нагрузок.
убедитесь, что вы не используете Javascript для отключения
<input type="file">поле при подачеубедитесь, что вы не вложенность формы, как
<form><form></form></form>Проверьте структуру HTML на наличие недопустимых / перекрывающихся тегов, таких как
<div><form></div></form>также убедитесь, что файл, который вы загрузка не содержит никаких не буквенно-цифровых символов.
однажды я просто потратил несколько часов, пытаясь понять, почему это случилось со мной внезапно. Оказалось, что я изменил некоторые настройки PHP в
.htaccess, и один из них (не уверен, что еще) вызывал сбой загрузки и$_FILESчтобы быть пустым.вы можете попытаться избежать подчеркивания (
_) в на<input>тегпопробуйте загрузить очень маленькие файлы, чтобы сузить ли это проблема размера файла.
Проверьте доступное дисковое пространство. Хотя и очень редко, он упоминается в этой комментарий к странице руководства PHP:
если массив $_FILES внезапно становится загадочно пустым, даже если ваша форма кажется правильной, вы должны проверить дисковое пространство, доступное для вашего временного раздела папки. В моем установка, все загрузки файлов не удалось без предупреждения. После долгого скрежета зубов я попытался освободить дополнительное пространство, после чего загрузка файлов внезапно снова сработала.
источник для некоторых из них points:
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 и атрибут формы data-ajax имеет значение true, массив файлов будет пустым. Поэтому установите data-ajax в false.
убедитесь, что ваш входной элемент имеет атрибут 'name'.
<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выше20mbно массивnull. Ответ: наш!--6--> должно быть большеupload_max_filesizepost_max_size = 750M upload_max_filesize = 750M
Я боролся с той же проблемой и тестировал все, не получая отчетов об ошибках, и ничего не казалось неправильным. У меня была error_reporting(E_ALL) Но вдруг я понял, что не проверил журнал apache и вуаля! В скрипте произошла синтаксическая ошибка...! (отсутствует "}")
Итак, даже если это что-то очевидное для проверки, это можно забыть... В моем случае (linux) он находится по адресу:
/var/log/apache2/error.log
если вы пытаетесь загрузить массив файлов, то вам может понадобиться, чтобы увеличить
max_file_uploadsнаphp.iniкоторый по умолчанию установлен в20Примечание:
max_file_uploadsне может быть изменен за пределами php.Ини. Смотрите PHP "ошибка" #50684
еще один возможный виновник-перенаправление apache. В моем случае у меня был httpd apache.conf настроен на перенаправление определенных страниц на нашем сайте в http-версии, а других страниц-в https-версии страницы, если они еще не были. Страница, на которой у меня была форма с вводом файла, была одной из страниц, настроенных для принудительного ssl, но страница, назначенная как действие формы, была настроена на http. Таким образом, страница отправит загрузку на версию ssl страницы действия, но apache был перенаправление его на http-версию страницы и данные post, включая загруженный файл, были потеряны.
никто не упоминал об этом, но это помогло мне, и не многие места в сети упоминают об этом.
убедитесь, что ваш PHP.ini устанавливает следующий ключ:
upload_tmp_dir="/path/to/some/tmp/folder"вам нужно будет проверить с вашим веб-хостом, если они хотят, чтобы вы использовали абсолютный путь к файлу сервера. Вы должны иметь возможность видеть другие примеры каталогов в вашем php.файл ini, чтобы определить это. Как только я установил его, я получил значения в моем _FILES объекта.
наконец убедитесь, что ваша папка tmp и где бы то ни было вы перемещаете файлы, чтобы иметь правильные разрешения, чтобы их можно было читать и записывать.
я столкнулся с той же проблемой и обнаружил, что это моя IDE была частью проблемы. Я запускал отладчик непосредственно из IDE (PHPStorm) вместо того, чтобы просто использовать браузер напрямую. IDE породил URL-адрес был следующим:
"...localhost:63342/CB_Upload/index.php?_ijt=j2hcbacqepj87bvg66ncuohvne"и просто использовать:
"...localhost/CB_Upload/index.php"работала просто отлично. Моя настройка-PC / Windows 10 / WAMPSERVER 3.0.6 64bit
проверьте свой php.ini для enable_post_data_reading=On потому что:
отключение этой опции приводит к тому, что $_POST и $_FILES не заполняются. Единственный способ прочитать postdata будет тогда через PHP: / / input stream wrapper. (... )
In http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading
Я получил ту же проблему, и ни одна из тем не была моей ошибкой. Проверьте в вашем .htaccess файл, если у вас есть один, если "MultiViews" включены. Мне пришлось их отключить.
если ваш основной скрипт
http://Some_long_URL/index.phpбудьте осторожны, чтобы указать полный URL (с явнымindex.phpи не толькоhttp://Some_long_URL) вactionполе. Удивительно, но если нет, то выполняется правильный скрипт, но с пустыми $_FILES !
у меня была аналогичная проблема, и проблема была в неправильном значении в htaccess, как упоминал шамиттомар.
изменить
php_value post_max_size 10MBдоphp_value post_max_size 10M
Я был пуст
$_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>
У меня тоже были проблемы с $ _FILES пустой. В приведенном выше контрольном списке не упоминаются мультивизы .htaccess, httpd.conf или httpd-vhost.конф.
Если у вас есть MultiViews, установленные в директиве options для вашего каталога, содержащего веб-сайт, $_FILES будет пустым, даже если заголовок Content-Length показывает, что файл, который я загрузил.
Если вы используете jQuery Mobile
использование составной формы с файловым вводом не поддерживается Ajax. В этом случае вы должны украсить родительскую форму данными-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>
Comments