Spring中的MaxUploadSizeExceededException

2023/05/19

1. 概述

在Spring框架中,当应用程序尝试上传大小超过配置中指定的特定阈值的文件时,会抛出MaxUploadSizeExceededException 。

在本教程中,我们将了解如何指定最大上传大小。然后我们将展示一个简单的文件上传控制器并讨论处理此异常的不同方法。

2. 设置最大上传大小

默认情况下,可以上传的文件大小没有限制。为了设置最大上传大小,你必须声明一个MultipartResolver类型的bean。

让我们看一个将文件大小限制为5MB的示例:

@Bean
public MultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(5242880);
    return multipartResolver;
}

3. 文件上传控制器

接下来,让我们定义一个控制器方法来处理文件的上传和保存到服务器:

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public ModelAndView uploadFile(MultipartFile file) throws IOException {
 
    ModelAndView modelAndView = new ModelAndView("file");
    InputStream in = file.getInputStream();
    File currDir = new File(".");
    String path = currDir.getAbsolutePath();
    FileOutputStream f = new FileOutputStream(path.substring(0, path.length()-1)+ file.getOriginalFilename());
    int ch = 0;
    while ((ch = in.read()) != -1) {
        f.write(ch);
    }
    
    f.flush();
    f.close();
    
    modelAndView.getModel().put("message", "File uploaded successfully!");
    return modelAndView;
}

如果用户尝试上传大小大于5MB的文件,应用程序将抛出MaxUploadSizeExceededException类型的异常。

4. 处理MaxUploadSizeExceededException

为了处理这个异常,我们可以让我们的控制器实现接口HandlerExceptionResolver,或者我们可以创建一个@ControllerAdvice注解类。

4.1 实现HandlerExceptionResolver

HandlerExceptionResolver接口声明了一个名为resolveException()的方法,可以处理不同类型的异常。

让我们覆盖resolveException()方法以在捕获到的异常类型为MaxUploadSizeExceededException时显示一条消息:

@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object object, Exception exc) {
    ModelAndView modelAndView = new ModelAndView("file");
    if (exc instanceof MaxUploadSizeExceededException) {
        modelAndView.getModel().put("message", "File size exceeds limit!");
    }
    return modelAndView;
}

4.2 创建控制器通知拦截器

通过拦截器而不是控制器本身处理异常有几个优点。一是我们可以对多个控制器应用相同的异常处理逻辑。

另一个是我们可以创建一个只针对我们想要处理的异常的方法,允许框架委托异常处理,而我们不必使用instanceof来检查抛出的异常类型:

@ControllerAdvice
public class FileUploadExceptionAdvice {
     
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public ModelAndView handleMaxSizeException(MaxUploadSizeExceededException exc, HttpServletRequest request, HttpServletResponse response) {
        ModelAndView modelAndView = new ModelAndView("file");
        modelAndView.getModel().put("message", "File too large!");
        return modelAndView;
    }
}

5. Tomcat配置

如果你要部署到Tomcat服务器版本7及更高版本,则可能需要设置或更改名为maxSwallowSize的配置属性。

此属性指定Tomcat在知道服务器将忽略文件时将为从客户端上传的文件“吞噬”的最大字节数。

该属性的默认值为2097152(2MB),如果保持不变或设置低于我们在MultipartResolver中设置的5MB限制,Tomcat将拒绝任何上传超过2MB文件的尝试,并且我们的自定义异常处理将永远不会被调用。

为了使请求成功并显示来自应用程序的错误消息,你需要将maxSwallowSize属性设置为负值。这指示Tomcat吞下所有失败的上传,无论文件大小如何。

这是在TOMCAT_HOME/conf/server.xml文件中完成的:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           maxSwallowSize="-1"/>

6. 总结

在本文中,我们演示了如何在Spring中配置最大文件上传大小,以及如何处理当客户端尝试上传超过此大小限制的文件时产生的MaxUploadSizeExceededException。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章