【问题标题】:Error handling by redirection in spring download file controllerspring 下载文件控制器中的重定向错误处理
【发布时间】:2015-02-04 02:34:37
【问题描述】:

This 问题很好地解释了如何在 spring 中编写下载文件控制器。 This 问题很好地解释了不能使用 response.sendRedirect() 发送 Post 请求

我希望用户被重定向到同一页面,并显示有关导致文件下载错误的错误。这是工作流程

  1. 用户点击 www.abc.com/index [控制器有映射 /index.jsp 并返回 ModelAndView]
  2. 在此页面,我们有一个文件下载,其 URL 为 www.abc.com/download?resource_id=123。 [控制器有映射/下载并返回void]
  3. 当文件下载出错时,应将用户重定向到 www.abc.com/index 并显示一些错误。
  4. 当文件下载没有错误时,用户停留在同一页面并出现文件下载对话框。

下面是一个sn-p用于转发:

@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 步是问题所在。

  • 使用转发将 URL 更改为错误报告的下载 URL。
  • 使用重定向作为带有隐藏参数的 response.sendRedirect() 是不可能的,根本不会修改 URL。
  • 将重定向用作带有隐藏参数的 response.sendRedirect(),并在 URL 末尾引入“?is_downloaded=false”

谁能告诉这个解决方法。

【问题讨论】:

  • 解决这个问题的2种方法,你不需要void作为返回值,返回ModelAndView或String会容易得多。

标签: java spring jsp spring-mvc


【解决方案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(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);

【讨论】:

  • 嗨,@Draukadin,我在我的 Spring Boot 应用程序中添加了 exceptionHandler() 方法。正在调用方法,但浏览器未显示错误页面。而是创建 0 大小的文件。我错过了什么吗?浏览器端的html代码是&lt;a download="filename.dat" href="http://localhost:8080/download/filename"&gt;
猜你喜欢
  • 2016-11-06
  • 2014-09-21
  • 2019-07-26
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
相关资源
最近更新 更多