java.lang.IllegalStateException,在struts中实现下载报response重复错误. 在execute中的代码如下:
byte[] fileBuf = getbyte();//得到输出的数据
long len = fileBuf.length;
int k = 0;
byte[] buf = new byte[65535];
response.setContentType("aplication/txt; charset=MS932");
response.setContentLength((int) len);
response.setHeader(
"Content-Disposition",
"attachment;" + " filename=" + fileName);
OutputStream out = response.getOutputStream();
try {
while ((long) k < len) {
int j = 0;
for (int i = 0; i < Constants.MAX_BUF_SIZE; i++) {
if ((long) k < len) {
buf[i] = fileBuf[k];
} else {
break;
}
k++;
j++;
}
out.write(buf, 0, j);
}
} finally {
out.close();
}
return mapping.findForward(SUCCESS);
}
------解决方法--------------------------------------------------------
你都
out.close();了
还
return mapping.findForward(SUCCESS);
不错才怪!
------解决方法--------------------------------------------------------
上面出错的原因可能是
1. 在 Forward 前使有了 close
2. 即使没有写 close,在某些情况下也会出错,如你下载的文件很大,造成 response buffer 已经 commit,这样也会出错,这点请参考 Servlet 规范的 buffer 的处理和 forward 的规范
3. 即使 buffer 没有 commit,使用 forward 会清空你上在所输出的内容,也得到你所要的结果
正确的写法我想应该是把 return mapping.findForward("success") 改成 return null;
上述解决方法我自己没有试过,不知道是不是可以,如果不行,建议直接使用 Servlet,那样简洁,也不容易也错