2025.6.26

这个警告日志 Resolved [org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded] 表示 Spring 框架在处理文件上传时,检测到上传的文件大小超过了系统配置的最大限制,触发了 MaxUploadSizeExceededException 异常。以下是具体分析和解决方案:


原因分析

  1. 默认限制
    Spring Boot 默认的文件上传大小限制为:

    • 单个文件:1MB(1048576 字节)
    • 单次请求(含多个文件):10MB
      超过任一限制都会触发此异常。
  2. 底层机制

    • 异常由 MultipartResolver(如 StandardServletMultipartResolverCommonsMultipartResolver)抛出,通常在解析请求时校验文件大小。
    • 如果使用 Tomcat 服务器,还需注意 maxSwallowSize 配置(默认 2MB),超过此值可能导致请求被直接拒绝,而非触发 Spring 的异常处理。

解决方案

1. 修改 Spring Boot 配置

application.propertiesapplication.yml 中调整文件大小限制:

# 设置单个文件最大为 50MB,请求整体最大为 100MB
spring.servlet.multipart.max-file-size=50MB
spring.servlet.multipart.max-request-size=100MB

或 YAML 格式:

spring:
  servlet:
    multipart:
      max-file-size: 50MB
      max-request-size: 100MB

注意

  • 高版本 Spring Boot(2.x+)使用 spring.servlet.multipart,低版本(1.x)使用 spring.http.multipart
  • 单位支持 KB``MB``GB 等。

2. Tomcat 服务器配置

如果使用内嵌 Tomcat,需额外配置 max-swallow-size(默认 2MB),避免请求被 Tomcat 提前拦截:

server.tomcat.max-swallow-size=-1  # 不限制,或设置为足够大的值(如 100MB)

或在 server.xml 中修改(外部 Tomcat):

<Connector port="8080" maxSwallowSize="-1" ... />

3. 自定义异常处理

通过 @ControllerAdvice 捕获异常并返回友好提示:

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public ResponseEntity<String> handleUploadSizeExceeded() {
        return ResponseEntity.badRequest().body("文件大小超过限制!");
    }
}

4. 临时目录问题

如果报错包含 The temporary upload location is not valid,可能是系统清理了临时目录。需通过配置固定临时路径:

spring.servlet.multipart.location=/data/tmp

或通过 MultipartConfigElement Bean 指定。


其他注意事项

  • Nginx 反向代理:若前端使用 Nginx,需检查 client_max_body_size 配置(默认 1MB),避免请求被 Nginx 拦截。
  • 文件类型校验:可通过工具类(如 Hutool)检查文件类型和实际字节头,避免伪造扩展名。

总结

该警告表明文件上传大小超限,需通过 Spring 配置****Tomcat 参数异常处理 综合解决。若问题持续,需检查上下游(如 Nginx临时目录)的配置。

posted @ 2025-06-26 23:01  258333  阅读(115)  评论(0)    收藏  举报