
spring boot 应用在生产环境上传大于 100mb 的文件时出现 503 错误,且请求未到达控制器,根本原因常是 multipart 功能未显式启用——即使配置了大小限制,`spring.servlet.multipart.enabled=true` 缺失会导致 tomcat 拒绝解析 multipart 请求体,直接返回 503。
在 Spring Boot 中,multipart 支持默认是禁用的(enabled=false),尤其在较早版本(如问题中使用的 Spring 5.0.8.RELEASE)中,仅设置 max-file-size 和 max-request-size 并不足以激活 multipart 解析器。当 Postman 发送大文件的 multipart/form-data 请求时,若 multipart 未启用,嵌入的 Tomcat(或底层 Servlet 容器)会直接拒绝该请求,甚至不将请求转发至 Spring MVC 生命周期,因此你观察不到任何日志、控制器也完全收不到调用——这正是 503 “Service Unavailable” 的典型表现(容器层面拦截,非应用层异常)。
✅ 正确配置需三步到位(application.properties):
# ✅ 必须显式启用 multipart 支持(关键!) spring.servlet.multipart.enabled=true # ✅ 设置单文件与总请求体上限(单位:B/K/M/G,支持后缀) spring.servlet.multipart.max-file-size=500MB spring.servlet.multipart.max-request-size=500MB # ✅ 针对内嵌 Tomcat 的额外缓冲区限制(Spring Boot 2.x+ 推荐用 server.tomcat.max-swallow-size) server.tomcat.max-http-form-post-size=500MB # (Spring Boot 2.3+ 更推荐:server.tomcat.max-swallow-size=500MB)
⚠️ 注意事项:
- spring.servlet.multipart.enabled=true 是前提条件,缺失则其余配置全部失效;
- 本地 localhost 测试成功而生产环境失败,极可能因反向代理(如 Nginx、ALB、API Gateway)或负载均衡器设置了更严格的请求体限制(如 Nginx 默认 client_max_body_size=1M),需同步检查并调整代理层配置;
- 若使用云平台(如 AWS ALB、Cloudflare),确认其支持大文件上传且未启用“请求体扫描”等中间件拦截;
- 生产环境建议添加超时优化(如 server.tomcat.connection-timeout=600000),避免大文件上传因超时中断;
- Controller 层保持简洁,大文件建议异步处理 + 进度反馈,避免阻塞主线程。
? 验证方式:
启动后访问 /actuator/env(需启用 Actuator),搜索 multipart,确认 spring.servlet.multipart.enabled 值为 true;同时抓包或查看 Tomcat access 日志,确认大文件请求是否真正抵达容器端口。
综上,503 并非代码逻辑错误,而是基础设施层的“准入开关”未打开。补全 enabled=true 后,配合合理的大小与超时配置,即可稳定支持百 MB 级文件上传。










