2013-08-16 123 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函數提交給你的控制器,他們顯示不同的頁面。