下载程序运行两次,第一次必然报错:getOutputStream() has already been called for this response

我写了段导出文件的代码,先将文件导出到服务器上,然后将文件夹压缩成一个压缩包,之后就是下载了,我下载调用了以下函数:
public void saveFileToResponse(String filepath, String filename,
HttpServletResponse response) throws AppException{
OutputStream outputstream = null; // 下载流
FileInputStream inputstream = null;
try {
response.reset();
response.setContentType("application/x-download");
String vfilename = URLEncoder.encode(filename, "UTF-8");
response.addHeader("Content-Disposition", "attachment;filename="
+ vfilename);
outputstream = response.getOutputStream(); // 得到向客户端输出二进制数据的对象
inputstream = new FileInputStream(filepath + File.separator
+ filename);
byte[] byteValue = new byte[512];
int tempValue = 0;
while ((tempValue = inputstream.read(byteValue)) > 0) {
outputstream.write(byteValue, 0, tempValue);
}
outputstream.flush();
} catch (IOException e) {
//用户取消下载
System.out.println("取消下载");
} finally {
try {
if (outputstream != null) {
outputstream.close();
}
if (inputstream != null) {
inputstream.close();
}
} catch (Exception e) {
Alert.FileError("文件读取异常,可能是文件损坏或不存在!错误信息为:" + e.getMessage());
}

File f = new File(filepath);
while (f.listFiles().length > 0) {
f.listFiles()[0].delete();
}
f.delete();
}
}
结果每次运行到
while ((tempValue = inputstream.read(byteValue)) > 0) {
outputstream.write(byteValue, 0, tempValue);
}
这段时就会运行一下然后报错,然后整个程序又开始重新运行,重新导出到服务器上然后再压缩再下载,第二次就不报错了,这是为什么?第一次报错的原因是什么?
我这里是运行到while ((tempValue = inputstream.read(byteValue)) > 0) {
outputstream.write(byteValue, 0, tempValue);
}的时候,运行了一半报错了,然后跳到了这里} catch (IOException e) {
//用户取消下载
System.out.println("取消下载");
之后的话才报
getOutputStream() has already been called for this response
,先报的错是:null
最新回答
我这个你不爱的人

2024-04-15 00:25:49

getOutputStream() has already been called for this response异常出现的原因和解决方法:
jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有妥善处理好的原因。

具体的原因:jsp编译成servlet之后在函数
_jspService(HttpServletRequest request, HttpServletResponse response)

的最后
有一段这样的代码
Java代码 收藏代码
finally {
if (_jspxFactory != null)
_jspxFactory.releasePageContext(_jspx_page_context);
}

这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和response.getOutputStream()相冲突的!所以会出现以上这个异常。然后当然是要提出解决的办法,其实挺简单的,在使用完输出流以后调用以下两行代码即可:

out.clear();
out = pageContext.pushBody();
追问
那这段代码是写在js中?
追答
添加到你的代码中去。。。
outputstream.flush();这个后面你试试
追问
不行,我这里虽然是通过前台传过来的对象,但实际上jsp编译成servlet是我自己写的代码,所以没有加response.getWriter()这段,实际上第一次运行的时候也执行了,但是就是while 这个循环执行了一半就报错了
追答
但实际上jsp编译成servlet是我自己写的代码 ...... 这个 什么意思。。这个不是由JSP Container干的事情吗。。
那你试试在调用saveFileToResponse这个方法 的外层方法添加一个return null 试试。。
如果再不行。。我也不知道了