Geo*_*rin 5 spring exception spring-mvc multipart spring-boot
我使用Spring Boot设置了一个非常简单的文件上传。我想知道当超过最大文件大小时是否有一种简单的方法来显示错误页面。
我已经上传了一个非常简单的示例,说明了我想在github上实现的目标。
基本上,这个想法是在全局Spring异常处理程序中捕获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;
}
}
Run Code Online (Sandbox Code Playgroud)
处理文件上传的控制器非常简单:
@RequestMapping("/")
public String uploadPage() {
return "uploadPage";
}
@RequestMapping(value = "/", method = RequestMethod.POST)
public String onUpload(@RequestParam MultipartFile file) {
System.out.println(file.getOriginalFilename());
return "uploadPage";
}
Run Code Online (Sandbox Code Playgroud)
还有与之关联的uploadPage.html百里香模板:
<!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>
Run Code Online (Sandbox Code Playgroud)
想法是当文件太大时,在同一上载页面中显示错误消息。
据我了解,可以将Spring的MultipartResolver配置为延迟地解决异常,并能够在Spring的级别(MVC异常处理程序)捕获这些异常,但是此代码似乎无济于事:
@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
public StandardServletMultipartResolver multipartResolver() {
StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
multipartResolver.setResolveLazily(true);
return multipartResolver;
}
Run Code Online (Sandbox Code Playgroud)
因此,在我采取诸如过滤器或扩展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"));
}
Run Code Online (Sandbox Code Playgroud)
像魅力一样工作,感觉就像一个优雅的解决方案。如果有人感兴趣,我在github上更新了该项目。非常感谢!
多部分请求解析发生在选择处理程序之前,因此没有@Controller,因此还没有@ControllerAdvice可言。您可以使用 ErrorController (请参阅http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-error-handling)那。
顺便说一句,你不需要@RequestParam。参数类型为 MultipartFile 就足够了。
归档时间: |
|
查看次数: |
7364 次 |
最近记录: |