gpt4 book ai didi

spring - 使用 Spring Boot 处理 MultipartException 并显示错误页面

转载 作者:行者123 更新时间:2023-12-04 07:52:45 27 4
gpt4 key购买 nike

我使用 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;
}
}

处理文件上传的 Controller 非常简单:
@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上的项目。
非常感谢!

最佳答案

多部分请求解析发生在选择处理程序之前,因此没有@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 就足够了。

关于spring - 使用 Spring Boot 处理 MultipartException 并显示错误页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29363705/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com