0
我收到我的AttachedFiles.jsp页以下错误:我应该在每次写入ServletOutputStream时都刷新它?
SEVERE: Servlet.service() for servlet [jsp] in context with path [/da8] threw exception [java.lang.IllegalStateException: getOutputStream() has already been called for this response] with root cause
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:678)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:213)
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:194)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:126)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:80)
at org.apache.jsp.jsp.AttachedFiles_jsp._jspService(AttachedFiles_jsp.java:786)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
我以前的版本有:
fileIn.close();
outStream.flush();
outStream.close();
while循环之后的权利,但我认为这是一个很好的做法,将关闭所有对象都在finally块中。 我也读了关闭()也刷新OutputStream。
后,我做了这个变化我得到上述错误:/
AttachedFiles.jsp
FileInputStream fileIn = null;
ServletOutputStream outStream = null;
try
{
File fileToDownload = new File(file);
response.setContentType("APPLICATION/OCTET-STREAM");
String fileName = request.getParameter("fileName");
if(fileName == null) fileName = "";
String disHeader = "Attachment; Filename=\""+fileName+"\"";
response.setHeader("Content-Disposition", disHeader);
fileIn = new FileInputStream(fileToDownload);
outStream = response.getOutputStream();
byte[] outputByte = new byte[(int) fileToDownload.length()];
//copy binary contect to output stream
while(fileIn.read(outputByte) != -1)
{
outStream.write(outputByte);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
outStream.close();
if (fileIn != null)
fileIn.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
有谁知道为什么我收到此错误?
如果是的话,我应该在写入outputStream后立即刷新while循环吗?
我会争辩说,因为你没有打开流,这是不是你的关闭。这可能更真实,因为你已经将所有这些内容嵌入到JSP中 - 这本身就是一个有问题的实践。根本不需要刷新 - 一旦控制权离开JSP,写入器/流将被刷新。我唯一使用flush的是在处理过程中进行部分更新。 – stdunbar
切勿在循环内部冲洗。您的复制循环会忽略'read(),'应该作为write()'的第三个参数提供的值以及零偏移量参数返回的值。 – EJP