Spring Boot超大文件上传出现ERR_CONNECTION_RESET问题求助
Spring Boot 文件上传超大文件时浏览器/Axios报ERR_CONNECTION_RESET问题解决
问题原因
- Tomcat默认异常处理逻辑:当请求体大小超出配置上限时,Tomcat会在请求解析阶段抛出
SizeLimitExceededException,此时请求还未进入Spring的DispatcherServlet处理流程,Tomcat默认会直接关闭TCP连接,导致浏览器/Axios收到ERR_CONNECTION_RESET错误。 - 客户端处理差异:Postman对连接断开的处理逻辑与浏览器/Axios不同,它能识别服务器的拒绝响应并展示错误信息,而浏览器/Axios直接判定为连接重置。
- 公司项目正常的原因:该项目大概率已经配置了Tomcat请求体吞入参数,或自定义了文件上传异常拦截逻辑,将异常处理转移到Spring层面,返回标准HTTP响应,避免了Tomcat直接断开连接。
解决方案
方案1:调整Tomcat参数,避免直接断开连接
在application.properties或application.yml中添加配置,让Tomcat在拒绝请求时正常完成响应:
# 设置Tomcat允许吞入的请求体大小为无限制(-1),避免因剩余请求体未处理导致连接断开 server.tomcat.max-swallow-size=-1 # 可选:延长连接超时时间,防止大文件上传中途超时 server.tomcat.connection-timeout=60000
方案2:Spring层面拦截文件大小异常,返回标准响应
结合Spring文件上传配置和全局异常处理器,将异常处理转移到Spring层面:
- 配置Spring文件上传限制:
spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB
- 编写全局异常处理器捕获文件上传异常:
import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.multipart.MultipartException; @ControllerAdvice public class FileUploadExceptionHandler { @ExceptionHandler(MultipartException.class) public ResponseEntity<String> handleFileUploadError(MultipartException e) { return new ResponseEntity<>("文件大小超出限制,最大允许10MB", HttpStatus.PAYLOAD_TOO_LARGE); } }
方案3:替换MultipartResolver(可选)
改用CommonsMultipartResolver在Spring层面提前校验文件大小,避免Tomcat抛出异常:
- 引入Maven依赖:
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
- 配置自定义MultipartResolver:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.multipart.commons.CommonsMultipartResolver; @Configuration public class MultipartConfig { @Bean public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxUploadSize(10 * 1024 * 1024); // 总请求体最大10MB resolver.setMaxUploadSizePerFile(10 * 1024 * 1024); // 单个文件最大10MB return resolver; } }
内容的提问来源于stack exchange,提问作者shikai
相关产品推荐
相关产品推荐

