Как сервлет может определить, когда загрузка была отменена? - PullRequest
4 голосов
/ 21 марта 2012

Вот код на стороне javascript для загрузки на основе форм:

iframe.setAttribute('src', 'javascript:false;');

Я использую приведенный выше код для отмены текущей загрузки, связанной с элементом ввода, помещенным в iframe.

Я использую приведенный ниже код для отмены текущей загрузки, отправленной через XHR:

myxhr.abort();

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

Как я могу определить через HttpServletRequest, отменил ли пользователь загрузку?

Ответы [ 3 ]

2 голосов
/ 21 марта 2012

Запрос POST с данными содержит заголовок Content-Length, который сообщает вам размер данных, которые будут загружены.

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

1 голос
/ 21 марта 2012

Если загрузка была отменена, браузер закроет соединение, что приведет к исключению ввода-вывода на стороне сервлета.Например, в Tomcat будет указано «Сброс соединения по пиру», и это ClientAbortException.Другие серверы оборачивают IOException по-другому.Суть в том, чтобы просто перехватить IOException, и вы должны иметь возможность обрабатывать его по своему усмотрению.

Использование длины содержимого ненадежно, поскольку для спецификации HTTP не требуются заголовки длины содержимого для POST - или для GET дляиметь значение.Дело в том, что если вы не уверены, что ваш Javascript XHR устанавливает заголовок явно, этот метод не будет работать.

В качестве альтернативы вы можете рассчитать его самостоятельно и установить его, чтобы убедиться, или, что еще лучше, добавить свой собственный поток символов в конец опубликованных данных в XHR, некоторую уникальную строку символов, например, "jh923k49sk $ 2 #% '. В сервлете отрежьте последние 14 символов входящего сообщения и сравните его со строкой. Если оно совпадает, вы знаете, что оно не было отменено.

0 голосов
/ 21 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...