наилучшая практика response.getOutputStream - PullRequest
3 голосов
/ 29 ноября 2010

любые комментарии к моему коду о разрешении пользователю загружать файл.

if(fileObject !=null)
response.setHeader("Content-disposition", "attachment; filename=\""+fileObject.getFilename()+"\"");
response.setContentType(fileObject.getFiletype());
response.setContentLength((int)fileObject.getFilesize().intValue());
try {
 if(response !=null && response.getOutputStream() !=null &&fileObject!=null && fileObject.getBinData() !=null ){
    OutputStream out = response.getOutputStream();
    out.write(fileObject.getBinData());
 }


} catch (IOException e) {
    throw new ApplicationRuntimeException(e);
}

большую часть времени, я не получаю ниже ошибки.но время от времени я получаю ошибку

29 Nov 2010 10:50:41,925 WARN [http-2020-2] - Unable to present exception page: getOutputStream() has already been called for this response
java.lang.IllegalStateException: getOutputStream() has already been called for this response
 at org.apache.catalina.connector.Response.getWriter(Response.java:610)

Ответы [ 4 ]

4 голосов
/ 29 ноября 2010

Сообщение об исключении ясно:

Невозможно представить страницу исключения : getOutputStream () уже был вызван для этого ответа
java.lang.IllegalStateException: getOutputStream() уже был вызван для этого ответа
на org.apache.catalina.connector.Response. getWriter (Response.java:610)

An IOExceptionбыл сброшен, и вы повторно выбросили его как пользовательское исключение, которое заставило контейнер сервлетов показать страницу исключения, которая будет использовать getWriter() для этого.Фактически вы должны отпустить любой IOException, потому что это обычно точка возврата.

Например, IOException может быть брошено во время работы, когда клиент прервал запрос.Лучше всего самостоятельно не ловить IOException в Servlet API.Это уже объявлено в предложении throws методов сервлета.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    FileObject fileObject = getItSomehow();
    if (fileObject != null && fileObject.getBinData() != null) {
        response.setHeader("Content-disposition", "attachment; filename=\"" + fileObject.getFilename() + "\"");
        response.setContentType(fileObject.getFiletype());
        response.setContentLength((int)fileObject.getFilesize().intValue());
        response.getOutputStream().write(fileObject.getBinData());
    } else {
        // ???
    }
}
3 голосов
/ 29 ноября 2010

Вы звоните response.getOutputStream() дважды.Вместо этого, вызовите его один раз и присвойте его локальной переменной, затем используйте эту переменную для проверки на ноль и операции write.

try {
 OutputStream out = response.getOutputStream();
 if(response !=null && out !=null &&fileObject!=null && fileObject.getBinData() !=null ){
    out.write(fileObject.getBinData());
 }
} catch (IOException e) {
  throw new ApplicationRuntimeException(e);
}
0 голосов
/ 29 ноября 2010

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

http://commons.apache.org/fileupload/apidocs/index.html?org/apache/commons/fileupload/util/package-summary.html

0 голосов
/ 29 ноября 2010

Как ответ может быть нулевым? Особенно после того, как вы уже использовали это? Или response.getOutputStream ()? Или fileObject, после того как вы уже проверили его на ненулевое значение? И использовал это? Эти тесты могут принести больше вреда, чем пользы.

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