我已经阅读了几种从Spring Controller方法下载文件的方法,要么返回FileSystemResource,要么返回void并使用outputStream。 我想要的是返回一个String,因为我想先验证用户输入。有点像...
public String downloadFile(BindingResult result, RedirectAttributes attr, ...) {
if(result.hasErrors()) {
....
return "redirect:/showForm";
}
...
return "success";
}
有可能吗?我还有什么办法可以做到这一点?谢谢
答案 0 :(得分:1)
如果我理解正确,您要做的就是将用户发送到页面,例如“它无法正常工作/验证”页面或发送文件。
如果是这种情况,我们解决它的方法是从我们的处理程序返回ModelAndView
。您也可以将它作为参数包含在处理程序中,Spring将为您创建一个参数,您可以返回它。如果表单输入验证失败,我们将ModelAndView
上的View设置为自定义视图,该视图将设置Content-Disposition和相关标头,然后从HttpServletResponse获取OutputStream
并写入文件输出为字节。
像这样(伪代码,所以可能需要调整):
@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
}
但是,如果你想返回一个String并进行文件下载,那么你必须跳过一些箍。我发现这样做的最简单方法是设置一个可以在JSP端读取的模型属性,该属性要么告诉JSP调用文件下载。在JSP代码中,您可以使用JSTL和JavaScript的组合来触发下载,使用AJAX或在我们的示例中,使用JavaScript在IFRAME
中进行下载。