我有一个使用Spring Boot设置的非常简单的文件上传。 我想知道是否有一个简单的方法来显示错误页面超过最大文件大小。使用Spring Boot处理MultipartException并显示错误页面
我已经上传了一个非常简单的例子,我试图实现on github。
基本上,这个想法是赶在MultipartException整体弹性异常处理程序:
@ControllerAdvice
public class UploadExceptionHandler {
@ExceptionHandler(MultipartException.class)
public ModelAndView handleError(MultipartException exception) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("error", exception.getMessage());
modelAndView.setViewName("uploadPage");
return modelAndView;
}
}
它处理文件上传控制器是非常简单的:
@RequestMapping("/")
public String uploadPage() {
return "uploadPage";
}
@RequestMapping(value = "/", method = RequestMethod.POST)
public String onUpload(@RequestParam MultipartFile file) {
System.out.println(file.getOriginalFilename());
return "uploadPage";
}
而且uploadPage.html与它相关的thymeleaf模板:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head lang="en">
<title>Upload</title>
</head>
<body>
<div style="color: red" th:text="${error}" th:if="${error}">
Error during upload
</div>
<form th:action="@{/}" method="post" enctype="multipart/form-data">
<input type="file" id="file" name="file"/>
<button type="submit" name="save">Submit</button>
</form>
</body>
</html>
这个想法是t o当文件太大时,在相同的上传页面中显示错误消息。
这是我的理解是一个将配置Spring的MultipartResolver懒洋洋地解决异常,并能够赶上在春季的水平(MVC异常处理程序)的异常,但此代码似乎并没有帮助:
@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
public StandardServletMultipartResolver multipartResolver() {
StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
multipartResolver.setResolveLazily(true);
return multipartResolver;
}
所以在我使用过滤器之类的极端措施或扩展MultipartResolver之前...
您是否知道用Spring MVC处理这些异常的干净方法?
答案
感谢@ rossen-stoyanchev。 这里是我落得这样做:
@RequestMapping("uploadError")
public ModelAndView onUploadError(HttpServletRequest request) {
ModelAndView modelAndView = new ModelAndView("uploadPage");
modelAndView.addObject("error", request.getAttribute(WebUtils.ERROR_MESSAGE_ATTRIBUTE));
return modelAndView;
}
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return container -> container.addErrorPages(new ErrorPage(MultipartException.class, "/uploadError"));
}
就像一个魅力,感觉就像一个完美的解决方案。 我更新了github上的项目,如果有人感兴趣。 非常感谢!
部分问题可能与多部分请求没有真正链接到Spring MVC的生命周期有关。我的意思是如果文件足够大,可以在同一页面上多次调用异常处理程序。令人费解的是,它可以起作用,有时候,实际上并不是懒惰地解决例外情况,但这种行为似乎并不一致。 – 2015-03-31 08:15:49
该解决方案对我无效。我添加了MultipartException的错误页面,当我尝试上传一个大文件时,我仍然崩溃。你可以帮我吗? – Greyshack 2015-10-19 20:58:20
存储库仍然存在:https://github.com/geowarin/multipartException它应该工作:) – 2015-10-21 16:33:35