【问题标题】:"getOutputStream() has already been called for this response" Exception when downloading a file with spring mvc“已经为此响应调用了getOutputStream()”使用spring mvc下载文件时出现异常
【发布时间】:2015-09-29 09:15:46
【问题描述】:

我正在从 jsp 下载文件,而控制器中的函数只是到达 jsp 的路径。但是,我收到“getOutputStream() 已为此响应调用”异常。我在其他问题上尝试了很多解决方案,但对我没有任何效果。

我的控制器:

   @RequestMapping(value="/openfile", params ={"path"})
public String openFile(@RequestParam(value="path", required=false) String path, ModelMap model) throws IOException {
    model.addAttribute("path", path);
    return "openfile";
}

我的 JSP:

String url = request.getParameter("path");
ServletOutputStream stream = null;
BufferedInputStream buf = null;
try {
    File file = new File(url);
    stream = response.getOutputStream();
    response.setContentType("application/download");
    response.addHeader("Content-Disposition", "attachment; filename=" + file.getName());
    response.setContentLength((int) file.length());
    FileInputStream input = new FileInputStream(file);
    buf = new BufferedInputStream(input);

    int readBytes = 0;
    while ((readBytes = buf.read()) != -1) {
        stream.write(readBytes);
    }
} catch (IOException ioe) {
    throw new ServletException(ioe.getMessage());
} catch(Exception ex){
    System.out.println("[openfile] Error: " + ex.getMessage());
} finally {
    if (stream != null) {
        stream.close();
    }
    if (buf != null) {
        buf.close();
    }
}

例外:

 java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:578)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:212)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:115)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:108)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:183)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:120)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
at org.apache.jsp.WEB_002dINF.views.openfile_jsp._jspService(openfile_jsp.java:154)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:721)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:466)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)
at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:267)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1221)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1005)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:952)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1527)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1484)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

文件已正确下载,但我收到这条烦人的消息。

谢谢!

【问题讨论】:

  • 您是否尝试过拨打setContentTypeaddHeadersetContentLength之前拨打getOutputStream?这似乎是显而易见的解决办法。
  • @Michael:你能包括你得到的实际异常吗?
  • 你到底为什么要把它放在 JSP 中,而是把代码移到控制器中。将response.getOutputStream() 移至您真正需要它的那一刻。
  • 恶心!您今天正在编写明天的遗留代码!
  • @JonSkeet 您好,感谢您的解决方案,但没有奏效。

标签: java spring jsp spring-mvc download


【解决方案1】:

放弃 JSP,该代码属于控制器,并将 response.getOutputStream 移动到您需要的位置。

@RequestMapping(value="/openfile", params ={"path"})
public void openFile(@RequestParam(value="path", required=false) String path, ModelMap model, HttpServletResponse response) throws ServletException {

    try {
        File file = new File(path);
        response.setContentType("application/download");
        response.addHeader("Content-Disposition", "attachment; filename=" + file.getName());
        response.setContentLength((int) file.length());
        FileInputStream input = new FileInputStream(file);
        BufferedInputStream buf = new BufferedInputStream(input);
        FileCopyUtils.copy(buf, response.getOutputStream());
    } catch (IOException ioe) {
        throw new ServletException(ioe.getMessage());
    } catch (Exception ex) {
        System.out.println("[openfile] Error: " + ex.getMessage());
    }
}

【讨论】:

  • 它就像一个魅力! :D。谢谢你的时间!你真棒;)
  • 我已经编辑了您的答案,因为它没有被编译以供将来参考。只是微小的变化。
猜你喜欢
  • 2017-07-17
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2015-08-14
  • 2020-01-08
相关资源
最近更新 更多