下载二进制文件后Struts 1 Action返回成功

时间:2014-05-14 20:08:12

标签: java web struts-1

我知道如何通过设置响应标头并将二进制文件复制到响应的输出流,从我的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");
}

2 个答案:

答案 0 :(得分:0)

我不相信您可以在下载文件后进行重定向或重新加载。这更像是一个HTTP限制,而不是Struts 1特有的。

将一个文件下载到浏览器需要一个HTTP响应,并且需要一个HTTP响应来重新加载页面。您正尝试从同一HTTP请求执行这两项操作,这是不可能的。请求不能有多个响应。

以同样的方式,除非页面本身包含<meta refresh="...">元素或某些重新加载的JavaScript,否则在向用户提供页面后,您无法发出重定向。这两种方法基本上都创建了另一个HTTP请求,但这两种方法都不对您开放,因为无法通过文件下载进行操作。

简而言之,你不可能做你想要的。

答案 1 :(得分:0)

您可以设置response.setHeader(&#34; Refresh&#34;,&#34; 1&#34;);根据这篇文章:

UMD

但是当您关闭浏览器文件下载弹出窗口时,它不起作用。