Размер загружаемого файла

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
0
9 613
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

  2. Это зависит от того, как работает сервер. Например, в 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, угадывая тип файла; вы не можете этого гарантировать, но он должен быть достаточно надежным для досрочного отклонения (хотя вам лучше проверить весь файл, когда он полностью доступен).

Теперь есть ошибка. Раньше я фильтровал такие файлы изображений не по размеру, а по типу содержимого; но так как вы хотите остановить запрос как можно скорее, возникает та же проблема: браузер получит ваш ответ только после отправки всего запроса, включая содержимое формы и, таким образом, загруженные файлы.

Если вам не нужен предоставленный контент и вы остановите загрузку, у вас нет другого выбора, кроме как жестко закрыть сокет. Пользователь увидит только сбивающее с толку сообщение «соединение сброшено одноранговым узлом». И это отстой, но это сделано специально.

Таким образом, вы хотите использовать этот метод только в случаях фоновых асинхронных проверок (с использованием таймера, который проверяет поле файла). Итак, у меня был такой хак:

  • Я использую jquery, чтобы узнать, изменилось ли поле файла
  • Когда выбирается новый файл, отключить все остальные поля файла в той же форме получает только этот.
  • Отправьте файл асинхронно (jQuery может сделать это за вас, он использует скрытый фрейм)
  • На стороне сервера проверьте заголовок (длина содержимого, тип содержимого, ...), отключите соединение, как только получите то, что вам нужно.
  • Установите переменную сеанса, сообщающую, был ли этот файл в порядке или нет.
  • На стороне клиента, так как файл загружается во фрейм вы даже не получите никакой обратной связи, если соединение закрыто. Ваша единственная альтернатива - таймер.
  • На стороне клиента таймер опрашивает сервер, чтобы получить статус загруженного файла. На стороне сервера у вас установлена ​​эта переменная сеанса, отправьте ее обратно в браузер.
  • У клиента есть код статуса; отобразить его в вашей форме: сообщение об ошибке, зеленая галочка / красный X, что угодно. Сбросить поле файла или отключить форму - решать вам. Не забудьте повторно включить другие поля файла.

Довольно грязно, а? Если у кого-то из вас есть лучшая альтернатива, я весь уши.

Другие вопросы по теме