Нет ошибок при загрузке действительно большого файла в PHP?
Вопрос
У меня есть форма PHP для загрузки файлов, и она работает нормально и отображает сообщение об ошибке, если что-то пошло не так.Это все хорошо.
Проблема в том, что когда я тестирую действительно большой файл, он просто обновляет страницу, как будто я вообще не отправлял файл, и ни одна из переменных $_POST из формы даже не отправляется на сервер.
Я хочу отобразить пользователю ошибку, сообщив ему, что файл слишком велик.Однако я не могу этого сделать.
Кто-нибудь знает, что происходит?
Решение
Проверьте свой ini-файл PHP, который определяет размер файла, который PHP позволяет загружать.Эти переменные важны:
- максимальный размер загружаемого файла (upload_max_filesize)
- максимальный размер данных сообщения (post_max_size)
- предел памяти (memory_limit)
Любые загрузки за пределами этих границ будут игнорироваться или выдаваться с ошибками, в зависимости от ваших настроек.
В этом разделе документации содержится лучшее резюме: http://ca3.php.net/manual/en/features.file-upload.common-pitfalls.php
РЕДАКТИРОВАТЬ:Также обратите внимание, что большинство браузеров не отправляют загрузки размером более 2 ГБ.Эта ссылка устарела, но дает представление: http://www.motobit.com/help/scptutl/pa98.htm.У кого-нибудь есть лучший источник информации по этому поводу?
Существуют также ограничения, которые могут быть наложены сервером, например Apache: http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestbody
Чтобы по-настоящему увидеть, что происходит, вам, вероятно, следует проверить журналы вашего веб-сервера, проверить лимит загрузки браузера (если вы используете Firefox) и попробовать проверить, работает ли print_r($_FILES)
генерирует любые полезные номера ошибок.Если ничего не помогает, попробуйте монитор сетевого трафика в firebug.Ключевым моментом является определение того, поступает ли запрос на сервер и как он выглядит (включая заголовки).Как только вы зайдете так далеко в цепочке, вы сможете вернуться и посмотреть, как PHP обрабатывает загрузку.
Другие советы
Ваш $ _POST, скорее всего, пуст, потому что загрузка превысила директиву post_max_size :
Со страницы директив PHP :
Если размер почтовых данных больше чем post_max_size, $ _POST и суперглобальные $ _FILES пусты . Это можно отслеживать различными способами, например передав переменную $ _GET скрипт, обрабатывающий данные, т.е.
<form action="edit.php?processed=1">
и затем проверка, если $ _GET ['обработано'] установлено.
вы не можете знать размер загружаемого файла, пока он не будет полностью загружен. поэтому, если вы хотите определить размер файла, а затем показать ошибку для больших файлов, сначала вы должны загрузить файл, а затем проверить размер файла. Для загрузки большого файла вы должны установить 2 параметра в вашем файле конфигурации php, php.ini. откройте его и найдите " upload_max_filesize " и установите максимальное значение, которое вы хотите. затем вы должны установить максимальное значение для параметров POST, потому что загруженные файлы принимаются через метод HTTP POST. найти " post_max_size " и установите для него большое значение.
Я бы реализовал простой скрипт, который выполняет обычные ajax-вызовы, чтобы узнать, сколько было сделано загрузки. Затем вы можете реализовать какой-то индикатор выполнения. В сети есть несколько примеров:
http://martinjansen.com/ 2007/04/28 / файл-загрузка-пРОГРЕСС-бары-с PHP /
максимальный размер загружаемого файла (upload_max_filesize) максимальный размер данных поста (post_max_size) директивы, которые вам нужно установить. Я протестировал его с несколькими ОС, браузерами и т. Д., И это единственное, о чем вам нужно беспокоиться.
отдельно от вариантов, на которые ответили прежние пользователи:
max upload filesize (upload_max_filesize)
max post data size (post_max_size)
memory limit (memory_limit)
есть также один, когда файл очень большой или строка занята, нужно много времени для выполнения этой операции, которая достигнет предела выполнения скрипта.
max_execution_time