2014-01-18 3 views
2

Я использую этот код для загрузки файла с FTP. Я получаю исключение в журнале tomcat, как показано ниже, я могу выполнить свою задачу, но размер моего журнала значительно увеличивается.JSP: getOutputStream() уже вызван для этого ответа

Код:

if (file.exists()) 
    { 
     if (file.canRead()) 
     { 
      // IE6 & SSL PDF Bug 
      // http://forums.sun.com/thread.jspa?threadID=526451&start=15&tstart=0 

      mimeType = new javax.activation.MimetypesFileTypeMap().getContentType(file); 
      response.setHeader("Cache-Control","private"); 
      response.setHeader("Pragma","expires"); 
      response.setHeader("Content-Disposition", "inline; filename=\"" + org.apache.commons.io.FilenameUtils.getName(file.getAbsolutePath()) + "\""); 
      response.setContentType(mimeType); 
      response.setContentLength((new Long(file.length())).intValue()); 
      byte[] buffer = new byte[(int)org.apache.commons.io.FileUtils.ONE_KB * 64]; 
      output=response.getOutputStream(); 
      bos = new java.io.BufferedOutputStream(output, buffer.length); 
      bis = new java.io.BufferedInputStream(new java.io.FileInputStream(file)); 
      while (bis.read(buffer) != -1) 
      { 
       bos.write(buffer); 
      } 
      bos.flush(); 
     } 
     else{System.out.println("Cannot read from file");} 
    } 
    else{System.out.println("File dosen't exist");} 

Сообщение об ошибке

Jan 18, 2014 6:11:31 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet jsp threw exception 
java.lang.IllegalStateException: getOutputStream() has already been called for this response 
at org.apache.catalina.connector.Response.getWriter(Response.java:611) 
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198) 
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125) 
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118) 
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:188) 
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118) 
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77) 

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

+0

- полный код в вашей функции? –

ответ

0

Использование сервлета для отправки двоичных данных в ответе, а не на странице JSP. Страницы JSP отправляют текстовый вывод и будут вызывать метод getWriter для отправки буферизованного вывода с страницы JSP.

Смотрите также this question.

3

вы не должны делать это в JSP, но вы должны использовать Servlet (даже если страница JSP гораздо более практичное)

однако если вы все же хотите использовать страницу JSP , используйте эту директиву:

<%@page language="java" trimDirectiveWhitespaces="true"%> 

кроме вопроса, так как вы используете Коммонс-ю:

if (file.exists()) 
{ 
    if (file.canRead()) 
    { 
     // IE6 & SSL PDF Bug 
     // http://forums.sun.com/thread.jspa?threadID=526451&start=15&tstart=0 

     mimeType = new javax.activation.MimetypesFileTypeMap().getContentType(file); 
     response.setHeader("Cache-Control","private"); 
     response.setHeader("Pragma","expires"); 
     response.setHeader("Content-Disposition", "inline; filename=\"" + org.apache.commons.io.FilenameUtils.getName(file.getAbsolutePath()) + "\""); 
     response.setContentType(mimeType); 
     response.setHeader("Content-Length", String.valueOf(file.length())); 

     OutputStream output = response.getOutputStream(); 
     FileUtils.copyFile(file, output); 
     output.close(); 
    } 
    else{System.out.println("Cannot read from file");} 
} 
else{System.out.println("File dosen't exist");} 
Смежные вопросы