Spring MVC 文件上传功能详解

Posted redreampt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC 文件上传功能详解相关的知识,希望对你有一定的参考价值。

前言

在Spring MVC中实现文件上传功能并不复杂,前端使用html语法,后端使用特定抽象。参考Spring Boot相关文档即可。本文主要讲解常见资料忽略的两个问题:

  • 文件上传错误
  • 链接重置问题

版本:Spring Boot 1.5x

文件上传错误

一个关注点是如何处理文件上传期间发生的错误,错误主要分为两类:

  • IOException 文件读取或写入错误。
  • MultipartException 上传文件时,超过文件大小上限所触发的异常。

IOException

只需要在Controller层完成捕获和处理,处理方式可以是重定向并附带错误消息到提交页面。

MultipartException

如果文件大小超出设定允许的上限,将抛出该异常。MultipartException是Spring MVC的分派异常,其处理逻辑理应由HandlerExceptionResolver进行处理,如果未处理则交给Servlet容器处理。

默认会返回一个403页面:
技术图片

实际DEBUG发现,默认情况下没有被Spring MVC层异常处理机制所处理,也未被Spring Boot的ErrorPage机制所处理。

尝试使用ErrorPage机制

默认情况Spring Boot注册了一个Global ErrorPage,它会处理所有未明确映射ErrorPage的异常和错误码。

你也可以添加自定义ErrorPage:

@Bean("mulitpartExceptionErrorPageRegistrar")
public ErrorPageRegistrar mulitpartExceptionErrorPageRegistrar(){
    return new ErrorPageRegistrar() {
       @Override
       public void registerErrorPages(ErrorPageRegistry registry) {
          registry.addErrorPages(new ErrorPage(MultipartException.class,"/uploadError"));
      }
    };
}

实际测试表明,这种机制无法处理MultipartException。

尝试使用Spring MVC异常处理机制

可以使用Controller Advice功能来实现:

@ControllerAdvice
public class FileSizeLimitMapper {
    @ExceptionHandler(MultipartException.class)
    public String handleUploadError(HttpServletRequest request){
        return "forward:/uploadError";
    }
}

这种方式能处理MultipartException。

链接重置问题

个人测试发现,当上传过大的文件时会出现连接重置问题。原因是因为根据HTTP协议,server只有接受完请求后才能返回响应,tomcat对一个连接单次请求可接收的最大字节数做了限制,超过限制将直接重置TCP链接。

以上是关于Spring MVC 文件上传功能详解的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 多文件上传与 HTML5 多文件表单功能

利用Spring MVC 上传图片文件

spring mvc怎么获取上传文件的原路径

Spring MVC文件上传

Spring MVC+Spring+Mybatis实现支付宝支付功能(图文详解)

spring mvc 文件上传怎么过滤文件类型,如exe文件等