【发布时间】:2015-06-04 12:01:43
【问题描述】:
我用 Spring Boot 设置了一个非常简单的文件上传。 我想知道是否有一种简单的方法可以在超过最大文件大小时显示错误页面。
我上传了一个非常简单的示例,说明我正在努力实现on 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;
}
}
处理文件上传的控制器非常简单:
@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>
这个想法是当文件太大时在同一个上传页面显示错误消息。
据我了解,可以配置 Spring 的 MultipartResolver 以延迟解析异常并能够在 Spring 级别(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 的生命周期这一事实有关。我的意思是如果文件足够大,可以在同一页面上多次调用异常处理程序。令人费解的是,有时它可以工作,但实际上并没有延迟解决异常,但这种行为似乎并不一致。
-
该解决方案对我不起作用。我添加了 MultipartException 的错误页面,当我尝试上传大文件时仍然崩溃。你能帮帮我吗?
-
存储库仍在运行:github.com/geowarin/multipartException 它应该可以工作 :)
-
我分叉了 repo 并试图验证这一点。我观察到从未调用过
@RequestMapping("uploadError")方法。我已经创建了这个问题github.com/Mastering-Spring-MVC-4/mastering-spring-mvc4/issues/…。
标签: spring spring-mvc exception spring-boot multipart