我知道如何通过设置响应头并将二进制文件复制到响应的输出流来从我的web应用程序下载二进制文件。但我遇到的问题是返回成功,所以页面将重新加载。如果我返回成功,我将得到错误:
. lang。getOutputStream()已经存在调用此响应
参见下面的代码示例。这将下载文件,然后抛出异常。有办法恢复响应吗?
public ActionForward export(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//tell browser program going to return an application file
//instead of html page
response.setContentType("application/force-download");
response.setHeader("Content-Disposition","attachment;filename=temp.csv");
IOUtils.copy(new FileInputStream("/path to some file"), response.getOutputStream());
response.flushBuffer();
return mapping.findForward("success");
}
我不相信你可以在文件下载后进行重定向或重新加载。这更像是一个HTTP限制,而不是Struts 1所特有的。
将文件下载到浏览器需要一个HTTP响应,重新加载页面需要一个HTTP响应。您试图在同一个HTTP请求中同时执行这两项操作,这是不可能的。一个请求不能有多个响应。
同样,在向用户提供页面后,您不能发出重定向,除非页面本身包含<meta refresh="...">
元素或一些执行重载的JavaScript。这两种方法本质上都创建了另一个HTTP请求,但是这两种方法都不对您开放,因为这两种方法都不能用于文件下载。
简而言之,你所要求的是不可能的。
可以设置响应。setHeader("刷新","1");根据这篇文章:
http://users.polytech.unice.fr/无法改写/课程/互联网/多边形/servlet/Servlet-Tutorial-Response-Headers.html
但是当你关闭浏览器文件下载弹出窗口时它不起作用。