Я выполняю сервлет в Tomcat 6.0.26. Сервлет принимает загрузку файла от клиента HTTP POST. Я хотел бы остановить загрузку файла со стороны HttpServlet. Я попробовал следующие методы без удачи:
Я погуглил, но не нашел прямых ответов. Советуйте решениям.
Спасибо.
Это невозможно с использованием стандартного сервлета или API Commons FileUpload. По сути, чтобы иметь возможность немедленно прервать соединение, вы должны физически захватить базовый сокет и закрыть его. Однако этот сокет контролируется веб-сервером. См. Также этот связанный вопрос: Как явно завершить http-соединение с сервером без заголовка ответа .
Небольшие тесты, однако, подтвердили, что Commons FileUpload не выполняет буферизацию всего файла в памяти, если его размер превышает установленный предел. Он будет читать входной поток, но просто проигнорирует и выбросит прочитанные байты (также те, которые уже прочитаны). Так что эффективность памяти здесь не обязательно проблема.
Чтобы решить настоящую проблему, вам нужно проверить размер файла на стороне клиента, а не на стороне сервера. Это возможно с помощью Java-апплета или Flash-приложения. Например, соответственно JumpLoader и SWFUpload .
Вопрос более или менее дублирует Aborting upload from a servlet to limit file size
Пробовали ли вы использовать Apache Commons FileUpload?
В объекте сервера, представляющем загрузку файла из запроса, есть метод setFileSizeMax.
Это невозможно с помощью стандартных API. И вы нарушаете некоторые стандарты протокола/RFC, если вы это сделаете. Так зачем вам это делать?
Вместо этого отправьте ответ "Connection: close" (заголовок http) без тела http.
вот какой-то безумный обходной путь: вы можете написать (или где-нибудь найти) какое-нибудь отдельное приложение брандмауэра, основанное на сокетах, которое обрабатывает HTTP-запросы, анализирует заголовки и, если запрос соответствует некоторым вашим пользовательским условиям - брандмауэр пересылает это в Tomcat, в противном случае возвращает ответ об ошибке HTTP. Или вы можете попробовать настроить Apache <-> Tomcat с некоторыми правилами Apache.