Как отправить файл из сервлета «правильным» способом? - PullRequest
2 голосов
/ 27 апреля 2011

Я пытаюсь отправить файл пользователю из сервлета http. Сервлет выполняет некоторые тесты идентификации (по запросу), а затем отправляет клиенту файл.

Обычно это работает, но теперь я включил перенаправление моего сервера TOMCAT на https, и когда я пытаюсь получить доступ к сервлету и загрузить файл из IE6 или IE8, происходит сбой, и я получаю следующее исключение:

java.lang.IllegalStateException: Cannot forward after response has been committed

(на localhost.log)

и

ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error

(в журнале сервлетов)

Код, который выполняет отправку (упрощенно):

private void sendFile(HttpServletResponse response, byte[] file, String clientFileName)
{
    ServletOutputStream op = null;

    setContentType(response);
    response.setHeader("Content-Disposition", "attachment; filename=\"" + clientFileName + "\"");
    // send byte array to output buffer. 
    op = response.getOutputStream();

    // Content Length must be set after all processing done.
    response.setContentLength((int) file.length);   
    op.write(file);
}

Это правильный способ отправки файла из сервлета? Какой лучший способ?

Спасибо !!

UPDATE

Использовал код из @BalusC artice по этой ссылке: http://balusc.blogspot.com/2007/07/fileservlet.html

Это заставило его работать.

По-прежнему не работает в IE6-IE8 при использовании из Gmail из-за стадии фильтрации, которую gmail добавляет к загрузкам в этих браузерах.

ОБНОВЛЕНИЕ 2

Кажется, проблема в Gmail + Internet Explorer 6-8. Я предполагаю, что gmail выполняет редирект (это на самом деле довольно очевидно, если вы посмотрите на URL на странице после того, как нажмете ссылку в письме). Является ли метод Client-Pull моим единственным решением?

1 Ответ

0 голосов
/ 28 апреля 2011

Решением проблемы является метод «Client-Pull».Добавляя значение Refresh в заголовок, мы заставляем браузер запрашивать файл.

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

В коде, который я сделал, это:

response.setHeader("Refresh", "3; URL=\"" + url.toString() + "\"");
forwardToJSP(request, response, "waitForBrowserRefreshPage.jsp");

Значение - через 3 секунды попросить пользователя указать указанный URL-адрес, который, в свою очередь, доставит файл клиенту.Метод forwardToJSP отображает сообщение «Вы скоро будете перенаправлены, здесь ссылка в случае сбоя».

...