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$FileSizeLimitExceededException 或 MaxUploadSizeExceededException。
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;
<p>import javax.servlet.MultipartConfigElement;</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/code/10717" title="魔法映像企业网站管理系统"><img
src="https://img.php.cn/upload/webcode/000/000/013/176344020398619.jpg" alt="魔法映像企业网站管理系统" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/code/10717" title="魔法映像企业网站管理系统">魔法映像企业网站管理系统</a>
<p>技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作</p>
</div>
<a href="/xiazai/code/10717" title="魔法映像企业网站管理系统" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p>@Configuration
public class UploadConfig {</p><pre class='brush:php;toolbar:false;'>@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。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxPostSize="52428800" /> <!-- 50MB,单位是字节 -->-
maxPostSize单位是**字节**,不是 MB,50 * 1024 * 1024 = 52428800,手算易错,建议写注释 - 改完
server.xml后必须重启 Tomcat,热加载不生效 - 云环境(如阿里云 EDAS、腾讯 TKE)可能有网关层额外限制(如 API 网关默认 10MB),需同步确认
真正上线前,拿一个真实大小的 XML 文件(比如 18MB 的 ISO 20022 报文)走一遍上传链路,别只测 2MB。很多问题出在“配置写了但没生效”或者“多层网关叠加限制”,而不是代码本身。









