2013-08-16 82 views
4

我在我的页面上有一个下载链接,它工作得很好,但它不刷新/重定向我的页面。这是我的代码。春季 - 下载文件并重定向

@RequestMapping(method = RequestMethod.POST, params = "exportToXML") 
public String exportToXML(HttpServletResponse response, Model model, @ModelAttribute(FILTER_FORM) ScreenModel form, 
     BindingResult result, OutputStream out, 
     HttpSession session) throws IOException { 
    ZipOutputStream zipout; 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 


     zipout = new ZipOutputStream(baos); 
     ZipEntry ze = new ZipEntry("file.xml"); 
     zipout.putNextEntry(ze); 
     zipout.write(string.getBytes()); 
     zipout.closeEntry(); 
     zipout.close(); 
     baos.close(); 


    response.setContentType("application/vnd.ms-excel"); 
    response.setHeader("Content-disposition", "attachment; filename=xx.zip"); 
    response.getOutputStream().write(baos.toByteArray()); 
    response.getOutputStream().close(); 
    response.getOutputStream().flush(); 
    return VIEW_NAME; 
} 

我已经删除了不相关的代码段,以使它缩短一点。我也尝试了@ResponseBody,但它给出了与上面的代码相同的结果。 任何建议将有帮助

回答

7

您无法下载文件并进行刷新/重定向。 我会尽力解释原因。请求流程如下所示: enter image description here

其中黄色圆圈是您的控制器。当你返回视图名称前控制器寻找适当的视图模板(简单的jsp,瓷砖或其他,取决于配置的视图解析器)获取响应并将生成的html(或不是html)代码写入它。

在你的情况进行操作:

response.getOutputStream().write(baos.toByteArray()); 
response.getOutputStream().close(); 
response.getOutputStream().flush(); 

就是行动春天不能公开回应后,写刷新页面,它(因为你之前做到这一点)。 所以您可以将方法签名更改为:

public void exportToXML(HttpServletResponse response, Model model, @ModelAttribute(FILTER_FORM) ScreenModel form, 
     BindingResult result, OutputStream out, 
     HttpSession session) throws IOException { 

,并删除最后一个“返回VIEW_NAME”。没有什么会改变。

1

它不会。浏览器在新窗口中打开ms-excel contentType,或者获得下载提示。启动下载的页面从来没有机会处理重定向或页面转换。

如果需要下载+页面刷新,JavaScript函数可以启动下载并将用户引导至下一页,该页面可以说“您的下载将很快开始”或类似的内容。

3

您可以:

response.setHeader("Refresh", "1; url = index"); 

这刷新1秒后在页面上的URL响应之后: “指数”。

0

你可以下载后,调用一个JavaScript函数提交给你的控制器,他们显示不同的页面。