У меня есть 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"; ?>
Вот контрольный список для загрузки файлов в 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 окружены STRAIGHT QUOTES, а не умные кавычки, вставленные из Word OR из веб-сайта (WordPress преобразует прямые цитаты в угловые кавычки!). Если на странице есть несколько форм, убедитесь, что оба они имеют этот атрибут. Введите их вручную или попробуйте прямые одинарные кавычки, введенные вручную.
Убедитесь, что у вас нет двух полей входных файлов с одинаковым атрибутом name
. Если вам нужно поддерживать несколько, поместите квадратные скобки в конце имени:
<input type="file" name="files[]"> <input type="file" name="files[]">
Убедитесь, что в каталогах tmp и upload установлены правильные разрешения на чтение и запись. Временная папка загрузки указана в настройках PHP как upload_tmp_dir
.
Убедитесь, что в папке с файлом и в каталогах tmp / upload нет пробелов.
Убедитесь, что на всех <form>
на вашей странице есть теги </form>
.
Убедитесь, что ваш тег FORM имеет method="POST"
. Запросы GET не поддерживают загрузку multipart / form-data.
Убедитесь, что ваш тег ввода файла имеет атрибут NAME. Атрибут ID НЕ достаточен! Идентификаторы атрибутов предназначены для использования в DOM, а не для полезных данных POST.
Убедитесь, что вы не используете Javascript для отключения поля <input type="file">
при отправке
Убедитесь, что вы не вложенные формы, такие как <form><form></form></form>
Проверьте структуру HTML для недопустимых / перекрывающихся тегов, например <div><form></div></form>
Также убедитесь, что загружаемый файл не содержит в нем никаких буквенно-цифровых символов.
Однажды я просто потратил часы, пытаясь понять, почему это происходит со мной внезапно. Оказалось, что я изменил некоторые параметры PHP в .htaccess
, и один из них (пока не уверен, что еще) вызвал ошибку загрузки, а $_FILES
– пустым.
Вы могли бы попытаться избежать подчеркивания ( _
) в атрибуте name=""
тега <input>
Попробуйте загрузить очень мелкие файлы, чтобы сузить, является ли это проблемой размера файла.
Проверьте доступное дисковое пространство. Хотя это очень редко, это упоминается в этом комментарии на странице 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
.