Отправляют ли веб-браузеры размер файла в заголовке http при загрузке файла на сервер? И если это так, то можно ли отказаться от файла, просто прочитав заголовок, не дожидаясь завершения всего процесса загрузки?





Я не уверен, но вы не должны действительно доверять чему-либо, отправляемому в заголовке, так как это может быть подделано пользователем.
Это зависит от того, как работает сервер. Например, в PHP ваш скрипт не будет запущен до завершения загрузки файла, поэтому это будет невозможно.
http://www.faqs.org/rfcs/rfc1867.html
HTTP-клиенты рекомендуется указывать длину содержимого для общего ввода файла, чтобы занятый сервер может определить, являются ли предлагаемые данные файла слишком большими, чтобы их можно было обрабатывается разумно
Но длина содержимого не требуется, поэтому на нее нельзя полагаться. Кроме того, злоумышленник может подделать контент неверной длины.
Прочитать содержимое файла - единственный надежный способ. Сказав это, если content-lenght присутствует и слишком велик, было бы разумно закрыть соединение.
Кроме того, контент отправляется как составной, поэтому большинство современных фреймворков сначала декодируют его. Это означает, что вы не получите поток байтов файла, пока не будет завершена работа с фреймворком, что может означать «пока не будет загружен весь файл».
Обновлено: прежде чем зайти слишком далеко, вы можете проверить этот другой ответ, полагаясь на конфигурацию apache: Использование jQuery, ограничение размера файла перед загрузкой. приведенное ниже описание полезно только в том случае, если вам действительно нужно еще больше индивидуальных отзывов.
Да, вы можете получить некоторую информацию заранее, прежде чем разрешить загрузку всего файла.
Вот пример заголовка, поступающего из формы с атрибутом enctype = "multipart/form-data":
POST / HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.7,fr-be;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------886261531333586100294758961
Content-Length: 135361
-----------------------------886261531333586100294758961
Content-Disposition: form-data; name = ""; filename = "IMG_1132.jpg"
Content-Type: image/jpeg
(data starts here and ends with -----------------------------886261531333586100294758961 )
У вас есть Content-Length в заголовке, и, кроме того, есть Content-Type в заголовке части файла (каждый файл имеет свой собственный заголовок, что является целью многостраничного кодирования). Помните, что браузер несет ответственность за установку соответствующего Content-Type, угадывая тип файла; вы не можете этого гарантировать, но он должен быть достаточно надежным для досрочного отклонения (хотя вам лучше проверить весь файл, когда он полностью доступен).
Теперь есть ошибка. Раньше я фильтровал такие файлы изображений не по размеру, а по типу содержимого; но так как вы хотите остановить запрос как можно скорее, возникает та же проблема: браузер получит ваш ответ только после отправки всего запроса, включая содержимое формы и, таким образом, загруженные файлы.
Если вам не нужен предоставленный контент и вы остановите загрузку, у вас нет другого выбора, кроме как жестко закрыть сокет. Пользователь увидит только сбивающее с толку сообщение «соединение сброшено одноранговым узлом». И это отстой, но это сделано специально.
Таким образом, вы хотите использовать этот метод только в случаях фоновых асинхронных проверок (с использованием таймера, который проверяет поле файла). Итак, у меня был такой хак:
Довольно грязно, а? Если у кого-то из вас есть лучшая альтернатива, я весь уши.