getOutputStream() has already been called for this response 问题

2019-03-25 13:46|来源: 网路

做一个jsp下载excel的功能,功能描述如下:首先将excel下载到服务器,然后从服务器下载到本地。
最开始是一个页面,点击下载,用ajax跳转到后台,将文件下载到服务器,然后跳回jsp,执行如下js:
if(xmlHttpRequest.status==200){//服务器状态码
       var loadDir = "/webrpt/loadFile.jsp?flag=1&dir=BBSJ_DOWNLOAD.zip" ;
       window.location.href (loadDir) ;
}
此时跳转到下载jsp页面,自动弹出下载窗口,下载jsp loadFile.JSP代码如下:
<%@   page   contentType="text/html;charset=GBK"   %>
  <%@   page   import="java.io.*"   %>
  <HTML>
  <meta http-equiv="Content-Type" content="text/html; charset=gbk">
  <BODY>
  <%
  java.io.BufferedInputStream bis=null;
  java.io.BufferedOutputStream bos=null;
  try{
    String filename=request.getParameter("dir");
    response.reset();
    File   fileLoad=new   File("D://",request.getParameter("dir"));
    filename=new String(filename.getBytes("iso8859-1"),"gbk");
    response.setContentType("application/x-download");
    response.setHeader("Content-disposition","attachment; filename="+new String(filename.getBytes("gbk"),"iso8859-1"));
    bis=new java.io.BufferedInputStream(new java.io.FileInputStream(fileLoad));
    bos=new java.io.BufferedOutputStream(response.getOutputStream());
    byte[] buff = new byte[2048];
    int bytesRead;
    while(-1 != (bytesRead = bis.read(buff, 0, buff.length))){
      bos.write(buff,0,bytesRead);
    }
    bos.flush();
  }catch(Exception e){
    e.printStackTrace();
  }finally{
    if(bis != null)bis.close();
    if(bos != null)bos.close();
  }%>
  </BODY>
  </HTML>

加断点显示,当弹出下载窗口的时候还没报错,再执行之后的outputstream出错,错误信息如下:
严重: Servlet.service() for servlet debugjsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:596)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:186)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:124)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:117)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:191)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:115)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
at org.apache.jsp.loadFile_jsp._jspService(org.apache.jsp.loadFile_jsp:84)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)

整了一天了,一直没有解决。。。。

问题补充:
xiaolongfeixiang 写道
第17行

 bos=new java.io.BufferedOutputStream(response.getOutputStream()); 



改为:

 bos=new java.io.BufferedOutputStream(out); 

可是out在上面还没有定义,该如何定义呢。

问题补充:
xiaolongfeixiang 写道
第17行

 bos=new java.io.BufferedOutputStream(response.getOutputStream()); 



改为:

 bos=new java.io.BufferedOutputStream(out); 


可out在上面还没有进行定义,该如何定义呢。

问题补充:
xiaolongfeixiang 写道
引用
可是out在上面还没有定义,该如何定义呢。


out是jsp内置的对象,不用定义的


不好意思,还是不大明白你的意思,我像你那样说的,将response.getOutputStream()直接改成out,是会出错的。
还需要其他的修改吗?

问题补充:
xiaolongfeixiang 写道
out是jsp内置的对象

你在jsp中调用 response.getOutputStream() 会报错如下:

java.lang.IllegalStateException: getOutputStream() has already been called for this response


建议你用Servlet完成此功能


谢谢您的建议,问题已解决,找了个servlet下载的,把原来的稍加修改就可以了,3q。

相关问答

更多