0

我已经阅读了几种从 Spring Controller 方法下载文件的方法,返回 FileSystemResource 或 void 并使用 outputStream。我想要的是返回一个字符串,因为我想首先验证用户输入。就像是...

public String downloadFile(BindingResult result, RedirectAttributes attr, ...) {
    if(result.hasErrors()) {
        ....
        return "redirect:/showForm";
    }
    ...
    return "success";
}

可能吗?我有什么替代方法可以做到这一点?谢谢

4

1 回答 1

1

如果我理解正确,您想要做的是将用户发送到一个页面,例如“它不起作用/验证”页面或发送文件。

如果是这种情况,我们解决它的方法是ModelAndView从我们的处理程序返回 a。您也可以将它作为参数包含在您的处理程序中,Spring 会为您创建一个,您可以直接返回它。如果表单输入验证失败,我们将View设置为自定义视图,该ModelAndView视图将设置 Content-Disposition 和相关标头,然后OutputStream从 HttpServletResponse 获取 并将文件写为字节。

像这样的东西(伪代码,所以可能需要调整):

@RequestMapping("/myHandler")
public ModelAndView myHandler(@ModelAttribute("myBean") MyBean myBean, BindingResults results, ModelAndView mav) {
  if (results.hasErrors()) {
    mav.setViewName("myErrorView");  // Uses the default view you have setup, passing the name as if you returned a String
  } else {
    mav.setView(new FileOutputView(dataToOutputOrWhatever);  // Custom View class to output file as needed
  }
  return mav
}

但是,如果您想返回一个字符串并下载文件,那么您必须跳过一些环节。我发现的最简单的方法是设置一个模型属性,您可以在 JSP 端读取该属性,该属性告诉 JSP 是否调用文件下载。在 JSP 代码中,您将使用 JSTL 和 JavaScript 的组合来触发下载,或者使用 AJAX,或者在我们的例子中,使用 JavaScript 在IFRAME.

于 2013-09-11T19:45:27.960 回答