我知道如何通过设置响应标头并将二进制文件复制到响应的输出流,从我的Web应用程序下载二进制文件。但是我遇到的麻烦就是返回成功,以便页面重新加载。如果我返回成功,我将收到错误:
java.lang.IllegalStateException: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");
}
答案 0 :(得分:0)
我不相信您可以在下载文件后进行重定向或重新加载。这更像是一个HTTP限制,而不是Struts 1特有的。
将一个文件下载到浏览器需要一个HTTP响应,并且需要一个HTTP响应来重新加载页面。您正尝试从同一HTTP请求执行这两项操作,这是不可能的。请求不能有多个响应。
以同样的方式,除非页面本身包含<meta refresh="...">
元素或某些重新加载的JavaScript,否则在向用户提供页面后,您无法发出重定向。这两种方法基本上都创建了另一个HTTP请求,但这两种方法都不对您开放,因为无法通过文件下载进行操作。
简而言之,你不可能做你想要的。
答案 1 :(得分:0)