对我的代码允许用户下载文件的任何评论。
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)
答案 0 :(得分:4)
异常消息很明确:
无法显示异常页:此响应已调用getOutputStream() java.lang.IllegalStateException:已经为此响应调用了getOutputStream() 在org.apache.catalina.connector.Response。 getWriter (Response.java:610)
抛出了IOException
并且您将其重新抛出为自定义异常,这迫使servletcontainer显示将使用getWriter()
的异常页面。事实上,你应该让任何IOException
去,因为这通常是一个不归路。
例如,当客户端中止请求时,可以在作业期间抛出IOException
。最佳做法是自己不捕获IOException
Servlet API。它已经在servlet方法的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 {
// ???
}
}
答案 1 :(得分:3)
您正在拨打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);
}
答案 2 :(得分:0)
如何回复为空?特别是在你已经使用它之后?还是response.getOutputStream()?或者fileObject,在你已经测试它为非null之后?用过吗?这些测试可能弊大于利。
答案 3 :(得分:0)