Как php определяет размер передаваемого файла?

nigirma

Новичок
У меня на сайте пользователь может загрузить через html форму файл с максимальным размером 10мб (ограничение выставлено в php.ini).

Задался вопросом, каким образом php определяет размер передаваемого файла?

Например, если пользователь укажет файл на загрузку размером в 100 мб, то как будет происходить его обработка сервером? На сервер загрузится сначала 10 мб, потом сработает какой-нибудь ограничитель максимального размера и произойдет остановка дальнейшей загрузки файла (90 мб). Типо того?
 

fixxxer

К.О.
Партнер клуба
php - это не веб сервер. Он запускается уже после того, как запрос целиком принят. (Хотя, возможно, в mod_php и есть какие-то ухищрения на эту тему; т.к. апача сто лет не видел, понятия не имею - но в любом случае, если таковые ухищрения и есть, они относятся к post_max_size, но не к upload_max_filesize).

Ограничить размер POST-запроса можно соответствующими настройками веб-сервера (client_max_body_size в случае с nginx), но надо учитывать, что браузеры не умеют корректно обрабатывать такие ошибки.

Еще очень хорошо понимать, как передаются аплоады - передаются совершенно тупым образом, формат примерно идентичен почтовым аттачам. Потому фактически передаваемый размер несколько больше (см. base64 и multipart form encoding).
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
php - это не веб сервер. Он запускается уже после того, как запрос целиком принят. (Хотя, возможно, в mod_php и есть какие-то ухищрения на эту тему; т.к. апача сто лет не видел, понятия не имею - но в любом случае, если таковые ухищрения и есть, они относятся к post_max_size, но не к upload_max_filesize).
В похапэ есть поддержка рисования прогресс-бара при загрузке файла, так что ухищрения таки существуют. Да и MAX_FILE_SIZE обрабатывается до полной загрузки, иначе в ём смысла не было бы.

Еще очень хорошо понимать, как передаются аплоады - передаются совершенно тупым образом, формат примерно идентичен почтовым аттачам. Потому фактически передаваемый размер несколько больше (см. base64 и multipart form encoding).
Файлы в multipart/form-data не кодируются в base64 вообще-то. Оверхед там есть, но O(1) за счёт заголовков, а не O(N).

А что касается исходного вопроса, то "размер передаваемого файла" можно определить, только приняв этот самый файл. Длину тела запроса POST (в котором может быть несколько файлов и прочего) можно взять из заголовка Content-Length, но таковой не обязан присутствовать, если, например, запрос идёт с Transfer-Encoding: chunked (посылают ли так браузеры --- не уверен).

Т.е. да: сначала мы принимаем 10 мегабайт, потом отказываемся от остального. Если запрос больше post_max_size, то вероятно его сразу зарубит.
 

fixxxer

К.О.
Партнер клуба
Да и MAX_FILE_SIZE обрабатывается до полной загрузки, иначе в ём смысла не было бы.
где оно обрабатывается? :confused:

Файлы в multipart/form-data не кодируются в base64 вообще-то
гы, и правда. Когда-то давно точно кодировались, иначе откуда я это взял? :)
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
где оно обрабатывается? :confused:
Цитата со страницы http://www.php.net/manual/en/features.file-upload.post-method.php
The MAX_FILE_SIZE hidden field (measured in bytes) must precede the file input field, and its value is the maximum filesize accepted by PHP. This form element should always be used as it saves users the trouble of waiting for a big file being transferred only to find that it was too large and the transfer failed.
гы, и правда. Когда-то давно точно кодировались, иначе откуда я это взял? :)
Вообще я посмотрел ещё раз RFC 1867, теоретически там может присутствовать Content-Transfer-Encoding: base64. Другой вопрос, присутствовал ли этот заголовок практически...
 
Сверху