При перенаправлении, прежде чем была завершена загрузка POST

У меня есть форма с загрузкой файла. Файлы, которые будут загружены на самом деле, являются изображениями и видео, таким образом, они могут быть довольно большими. У меня есть логика, которая на основе заголовков и первый 1 КБ может определить, будут ли остальные обработаны или сразу отклонены. В более позднем случае я хотел бы перенаправить клиент к ошибочной странице, не имея необходимость ожидать загрузки на конец.

Случай, это просто передающий ответ, прежде чем POST будет завершен, кажется, не работает. Перенаправление проигнорировано и если я закрываю соединение, браузер жалуется с "Соединением, сброшенным одноранговым узлом" ошибка.

Таким образом, вопрос: даже возможно сделать это в чистом HTTP (без JavaScript на клиентском), и если так, как?

20
задан vartec 7 June 2010 в 15:45
поделиться

3 ответа

Протокол HTTP / 1.1 допускает это, но очень странным и беспорядочным образом. Вам необходимо выполнить следующие 3 шага:

  1. Немедленно (внезапно) закрыть соединение, сохранить флаг на стороне сервера для клиентского сеанса
  2. Используйте этот флаг, чтобы обнаружить попытку повторной отправки тех же данных формы, спецификация рекомендует клиенту сделать это автоматически
  3. Отправить статус ошибки с перенаправлением (например, 302 временно перемещено)

Это ДОЛЖНО работать, потому что, как указано ниже, ожидается, что клиент попытается установить соединение хотя бы один раз. после того, как его неожиданно отключили. Ожидается, что при повторной попытке (-ях) отправляются только заголовки, затем ждут и наблюдают за ответом об ошибке и прерывают отправку тела, если оно его получит.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

8.2.4 Поведение клиента, если сервер преждевременно закрывает соединение

Если клиент HTTP / 1.1 отправляет запрос который включает тело запроса, но который не включает ожидание поле заголовка запроса с "100-продолжение" ожидания, и если клиент не связан напрямую с HTTP / 1.1 исходный сервер, и если клиент видит, что соединение закрывается до получения статуса от сервер, клиент ДОЛЖЕН повторить попытку запрос. Если клиент все же попытается это сделать запрос, он МОЖЕТ использовать следующие алгоритм "двоичного экспоненциального отката" быть уверенным в получении надежного ответ:

  1. Инициировать новое подключение к серверу

2. Передайте заголовки запроса.

3. Инициализируйте переменную R равным расчетному времени кругового обхода до
сервер (например, в зависимости от времени, которое потребовалось для установки
соединение), или на постоянное значение 5 секунд, если раунд-
время поездки недоступно.

4. Вычислить T = R * (2 ** N), где N - количество предыдущих
повторные попытки этого запроса.

5. Дождитесь либо сообщения об ошибке от сервера, либо T
секунды (в зависимости от того, что наступит раньше)

6. Если сообщение об ошибке не получено, через T секунд передайте сообщение
тело запроса.

7. Если клиент видит, что соединение преждевременно закрыто,
повторять с шага 1 до тех пор, пока запрос не будет принят, ошибка
получен ответ, или пользователь становится нетерпеливым и
завершает процесс повтора.

Если в какой-либо момент отображается состояние ошибки получен, клиент

  - НЕ ДОЛЖЕН продолжать и

 - СЛЕДУЕТ закрыть соединение, если оно не завершило отправку
сообщение-запрос.

Подсказки:

  1. Это то, что в спецификации сказано, что браузеры ДОЛЖНЫ делать. Кто знает, что браузеры ДЕЙСТВИТЕЛЬНО делают в этом случае? Не я. Вам нужно будет провести несколько тестов.
  2. В спецификации особо упоминается, что такое поведение применяется только ", если клиент не подключен напрямую к HTTP / 1.1 origin server ". Это кажется действительно странным требованием, которое на практике означает, что вам может потребоваться подделать заголовки ответа вашего сервера, чтобы представить, что вы прокси-сервер или сервер HTTP / 1.0.
  3. Некоторые промежуточные протоколы, такие как fast-cgi может не активировать ваш скрипт, пока запрос не будет завершен. В этом случае вам действительно понадобится настоящий низкоуровневый сервер сокетов.
  4. Весь этот процесс запутан и запутан и может даже не работать. Лучше использовать На мой взгляд, AJAX. Тем не менее, вы спросили, можно ли это сделать без JS.
15
ответ дан 30 November 2019 в 01:18
поделиться

Взгляните на билет django # 10850 - «Невозможно остановить загрузку большого файла в середине потока» .Не решает проблему, но, по крайней мере, должно помочь вам понять ее.

3
ответ дан 30 November 2019 в 01:18
поделиться
  1. используйте расширение PCEL uploadprogress, если вы используете apache
  2. создайте файл для опроса meta через Ajax, и возвращайте true или false на основе вашего условия, вы также можете получить файл temp_name и проверить наличие 1kb meta.
  3. вызов ajax должен быть связан с функцией, которая использует HTML meta-refresh заголовки для перенаправления или оставления до завершения загрузки.


Посмотрите примеры uploadprogress.

-1
ответ дан 30 November 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: