This问题很好地解释了如何在春天编写下载文件控制器。 This问题很好地解释了无法使用response.sendRedirect()发送Post请求
我希望将用户重定向到同一页面,并显示导致文件下载错误的错误。这是工作流程
以下是转发代码段:
@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
}
第3步是问题所在。
任何人都可以告诉解决方法。
答案 0 :(得分: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);
}
如果文件在服务器上是本地文件,则可以使用FileSystemResource代替InputStreamResource。
服务层负责在HttpHeaders对象上设置响应头值
responseHeaders.setContentType(MediaType.parseMediaType(objectMetaData.getContentType()));
responseHeaders.setContentLength(objectMetaData.getContentLength());
responseHeaders.setContentDispositionFormData("attachment", fileName);