2014-12-05 40 views
4

This問題很好地解釋瞭如何在春季編寫下載文件控制器。 This問題很好地解釋說Post請求無法使用response.sendRedirect()錯誤處理在春季下載文件控制器重定向

我希望用戶被重定向到同一頁面,並報告導致文件下載錯誤的原因。這裏是工作流程

  1. 用戶點擊www.abc.com/index [控制器具有映射/index.jsp和返回的ModelAndView]
  2. 在這個頁面,我們有具有URL www.abc文件下載。 COM /下載?RESOURCE_ID = 123。 [控制器已映射/下載並返回無效]
  3. 當文件下載出現錯誤時,應將用戶重定向到www.abc.com/index並顯示一些錯誤。
  4. 當文件下載沒有錯誤時,用戶停留在同一頁面並出現文件下載對話框。

以下爲轉發的片段:

@RequestMapping(/download) 
public void execute(@RequestParam(value = "resource_id" required = true) final String resource, final HttpServletRequest request, final HttpServletResponse response) { 
    try { 
     //some processing 
    } catch { 
     RequestDispatcher dispatcher = request.getRequestDispatcher("/index" + "?is_downloaded=false"); 
     dispatcher.forward(request, response) 
    } 
} 

@RequestMapping(/index) 
public void execute(@RequestParam(value = "is_downloaded" required = false) final String isDownloaded, final HttpServletRequest request) { 
    //do stuff here 
} 

第三步是問題。

  • 使用轉發將URL更改爲錯誤報告的下載URL。
  • 使用重定向作爲帶有隱藏參數的response.sendRedirect()是不可能的,根本不會修改URL。
  • 使用重定向爲response.sendRedirect是()的隱含參數,並會引入「?is_downloaded =假」在URL

結束誰能告訴解決類似的問題。

+1

2的方法來解決這個問題,你不需要爲無效返回值,返回的ModelAndView或字符串會容易得多。 – Jaiwo99 2014-12-05 23:56:48

回答

1

我一直有類似的問題,並用下面的代碼解決它。

我在我的控制器中有以下異常處理程序。如果出現錯誤,則會處理重新發送和錯誤消息。

@ExceptionHandler(FileNotFoundException.class) 
public ModelAndView exceptionHandler(Exception ex) { 
    ModelAndView modelAndView = new ModelAndView(); 
    modelAndView.setViewName("rescues/general"); 
    modelAndView.addObject("message", ex.getMessage()); 
    return modelAndView; 
} 

這裏是RequestMapping

@RequestMapping(value = "s3Download.request", method = RequestMethod.GET) 
@ResponseBody 
public ResponseEntity<InputStreamResource> download(@RequestParam(value = "s3key") String s3Key) 
     throws IOException { 
    HttpHeaders responseHeaders = new HttpHeaders(); 
    InputStreamResource inputStreamResource = s3DownloadService.getS3File(s3Key, responseHeaders); 
    return new ResponseEntity<>(inputStreamResource, responseHeaders, HttpStatus.OK); 
} 

如果文件是存儲在您的服務器就可以替代的InputStreamResource的使用的FileSystemResource上。

服務層需要設置在HttpHeaders的響應報頭值的照顧對象

responseHeaders.setContentType(MediaType.parseMediaType(objectMetaData.getContentType())); 
responseHeaders.setContentLength(objectMetaData.getContentLength()); 
responseHeaders.setContentDispositionFormData("attachment", fileName);