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 多文件表单功能