码迷,mamicode.com
首页 > 编程语言 > 详细

Spring MVC 文件上传功能详解

时间:2019-04-23 11:09:50      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:bug   src   测试   handler   允许   global   control   forward   根据   

前言

在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 文件上传功能详解

标签:bug   src   测试   handler   允许   global   control   forward   根据   

原文地址:https://www.cnblogs.com/redreampt/p/10755050.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!