SpringBoot处理XML文件上传 SpringBoot如何配置上传大小

Spring Boot 内置 Tomcat 默认单文件上传限制为 1MB、总请求 10MB;XML 因结构冗余易超限,触发 FileSizeLimitExceededException;需在 application.yml 中配置 spring.servlet.multipart.max-file-size 等参数,或通过 MultipartConfigElement Bean 动态设置,并注意外部 Tomcat 的 maxPostSize 及云网关限制。

Spring Boot 默认上传限制是多少?为什么 XML 文件常踩坑

Spring Boot 内置 Tomcat 默认只允许单文件 ≤ 1MB(即 1048576 字节),整个请求 ≤ 10MB。XML 文件虽是文本,但带命名空间、缩进、注释或嵌套结构时,很容易超过 1MB——比如一个导出的财务报表 XML 或 CAD 元数据 XML,动辄几 MB。一旦超限,你会看到这类错误:org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededExceptionMaxUploadSizeExceededException

application.yml 中最简配置方式(推荐初试/运维快速生效)

这是修改成本最低、见效最快的方案,适用于大多数标准部署场景。注意:Spring Boot 2.0+ 统一使用 spring.servlet.multipart.* 前缀,旧版 spring.http.multipart.* 已废弃,用错会静默失效。

spring:
  servlet:
    multipart:
      enabled: true
      max-file-size: 20MB
      max-request-size: 50MB
      file-size-threshold: 2MB
  • max-file-size:单个 XML 文件上限,设为 20MB 可覆盖绝大多数业务 XML
  • max-request-size:整个 HTTP 请求体总大小,含多个文件 + 表单字段,建议 ≥ 单文件限制 × 并发数预估
  • file-size-threshold:≤ 该值的文件直接存内存,否则写临时磁盘;设 2MB 可避免小 XML 频繁 IO,但别设太高(如 >10MB),否则 GC 压力大

Java 配置类方式(适合需要动态控制或兼容老版本)

当你要根据环境(dev/test/prod)差异化设置,或集成自定义拦截逻辑(如按用户角色限流),用 @Configuration + MultipartConfigElement 更灵活。注意:该 Bean 必须在 Spring 容器启动早期注册,否则无效。

import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.unit.DataSize;

import javax.servlet.MultipartConfigElement;

@Configuration public class UploadConfig {

@Bean
public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    factory.setMaxFileSize(DataSize.ofMegabytes(20));
    factory.setMaxRequestSize(DataSize.ofMegabytes(50));
    // ⚠️ 不要用字符串如 "20MB",低版本 Spring Boot 会解析失败
    return factory.createMultipartConfig();
}

}

  • 必须用 DataSize.ofMegabytes() 等类型安全方法,避免字符串解析歧义(如 "20mb" vs "20MB"
  • 如果项目用了 Undertow 或 Jetty,此配置不生效——它们不认 MultipartConfigElement,得查对应服务器文档
  • 若同时存在 application.yml 和该 Bean,Bean 优先级更高,但容易引发配置冲突,建议二选一

别漏掉外部 Tomcat 的 maxPostSize(上线前必查)

如果你把 Spring Boot 打成 war 包部署到独立 Tomcat(非内嵌),application.yml 的配置只管 Spring 层,Tomcat 自己还会校验 maxPostSize。默认是 2MB,比 Spring 还严——这时即使 Spring 放开了,请求也卡在容器层,报错无提示或直接 400。

 
  • maxPostSize 单位是**字节**,不是 MB,50 * 1024 * 1024 = 52428800,手算易错,建议写注释
  • 改完 server.xml 后必须重启 Tomcat,热加载不生效
  • 云环境(如阿里云 EDAS、腾讯 TKE)可能有网关层额外限制(如 API 网关默认 10MB),需同步确认

真正上线前,拿一个真实大小的 XML 文件(比如 18MB 的 ISO 20022 报文)走一遍上传链路,别只测

2MB。很多问题出在“配置写了但没生效”或者“多层网关叠加限制”,而不是代码本身。