2015-03-31 73 views
5

我有一个使用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上的项目,如果有人感兴趣。 非常感谢!

+0

部分问题可能与多部分请求没有真正链接到Spring MVC的生命周期有关。我的意思是如果文件足够大,可以在同一页面上多次调用异常处理程序。令人费解的是,它可以起作用,有时候,实际上并不是懒惰地解决例外情况,但这种行为似乎并不一致。 – 2015-03-31 08:15:49

+0

该解决方案对我无效。我添加了MultipartException的错误页面,当我尝试上传一个大文件时,我仍然崩溃。你可以帮我吗? – Greyshack 2015-10-19 20:58:20

+0

存储库仍然存在:https://github.com/geowarin/multipartException它应该工作:) – 2015-10-21 16:33:35

回答

2

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

+0

但是如果我想只返回对象到ajax而不是页面怎么办 – gstackoverflow 2017-11-20 20:08:31

相关问题