PHP $ POST / $ файлы пустые При загрузке больше, чем максимальный размер POST [дубликат]

Возможные Дубликаты:
как определить, загрузил ли пользователь файл больше, чем post_max_size?

Я пишу скрипт, который обрабатывает загрузку файлов из веб-приложения. Я установила лимит на размер файлов, которые могут быть загружены в мое приложение (ограничения пространства хранения). В настоящее время я пытаюсь поместить некоторый код проверки, который проверит, чтобы убедиться, что пользователь действительно загрузил файл, чтобы я мог отобразить хорошее сообщение об ошибке для них. Но я также хотел бы иметь возможность отображать сообщение об ошибке Пользователю, если они загрузили слишком большой файл. Я могу использовать Javascript для этого, но я хотел бы проверить PHP, если у них нет Javascript включен.

Я установил свой POST_MAX_SIZE var в PHP.ini должен быть максимальным размером загрузки файла, но это вызвало неожиданную проблему. Если кто-то пытается загрузить файл больше, чем POST_MAX_SIZE, двоичные данные просто усекаются по максимуму размер, и массив $_FILES не содержит записи для этого файла. Это то же самое поведение, которое возникло бы, если бы пользователь вообще не отправлял файл.

это затрудняет определение того, почему массив $_FILES не содержит файл, т. е. не был ли он когда-либо загружен или был слишком большим для отправки полностью.

есть ли способ, чтобы различать эти два случая? Другими словами, есть ли способ узнать, были ли данные POST отправлены для файла, но были усечены преждевременно, до отправки всего файла?

2 ответов


как ни странно,это преднамеренное поведение, поскольку POST_MAX_SIZE является низкоуровневым предельным отказоустойчивым, и для защиты вас и предотвращения DOS-атак сервер не может ничего сделать, кроме как отбросить все данные POST, когда он понимает, что он получает больше данных, чем может безопасно обрабатывать. Вы можете поднять это значение, если знаете, что вам нужно получить больше данных, чем это сразу (но убедитесь, что ваш сервер может справиться с увеличенной нагрузкой, которую это поставит на него), но я бы предложите взглянуть на другие способы обработки вашего варианта использования, столкнувшись с POST_MAX_SIZE, предлагает мне, что могут быть более надежные решения, чем один массивный HTTP-пост, например, разделение его на несколько вызовов AJAX.

отдельно от POST_MAX_SIZE есть UPLOAD_MAX_SIZE который является php.настройка ini для ограничения одного файла, о чем я предполагал, что вы говорили изначально. Это ограничивает размер любого загруженного файла, и если файл превышает этой значение, оно установит $_FILES['file']['error'] to 1. Вообще говоря, вы хотите, чтобы ваш сайт был настроен следующим образом:

  • на <form> MAX_FILE_SIZE должен быть установлен на максимум, который вы действительно хотите принять для этой формы. Хотя любой пользователь, пытающийся использовать ваш сайт, может обойти это, это хорошо для пользователей, фактически использующих ваш сайт, так как браузер будет (на самом деле, может) предотвратить их от тратить пропускную способность, пытаясь загрузить его. Этот всегда должно быть меньше, чем настройки на стороне сервера.
  • UPLOAD_MAX_FILESIZE - это максимальный размер, который сервер примет, отбросив что-либо большее и сообщив об ошибке $_FILES массив. Это должно быть больше чем самый большой файл, который вы хотите фактически принять на своем сайте.
  • установка post_max_size - это максимальный объем данных, который ваш сервер готов принять в одном запросе POST. Это должно быть больше, чем UPLOAD_MAX_SIZE для того, чтобы большие загрузки были успешными, и должны быть намного больше, чтобы разрешить загрузку более одного файла за раз. Я мог бы предложить значение UPLOAD_MAX_FILESIZE * 4.1 - это позволит четыре больших файла одновременно, а также немного дополнительных данных. YMMV, конечно, и вы должны убедиться, что ваш сервер может правильно обрабатывать любые значения, которые вы решите установить.

к вашему конкретному вопросу о том, как сказать, документация PHP на POST_MAX_SIZE I связана с предлагается установить переменную get в форме, т. е.

<form action="edit.php?processed=1">

однако, как я уже сказал выше, если вы столкнулись с этой проблемой, вы можете изучить альтернативные методы загрузки.


что-то вроде этого:

if ($_SERVER['CONTENT_LENGTH'] && !$_FILES && !$_POST) {
  // upload failed
}

непроверенный, поэтому поиграйте с различными сценариями, чтобы увидеть, какая комбинация работает. Не уверен, что он работает с несколькими загрузками файлов одновременно.

возможно, Вам потребуется проверить $_SERVER['CONTENT_LENGTH'] и сравните его с суммой файлов, полученных при работе с несколькими загрузками.