Spring Boot 文件上传 REST 接口核心是正确处理 multipart/form-data 请求,需用 @ModelAttribute 绑定含 MultipartFile 的请求模型,配置大小限制,服务层校验类型与大小、生成 UUID 文件名,并分离存储逻辑。

Java 中开发文件上传的 REST 接口,核心是正确处理 multipart/form-data 请求,并在 Spring Boot 环境下合理组织控制器、请求模型与服务逻辑。关键不在“能不能传”,而在于“怎么传得安全、可维护、可扩展”。
使用 @ModelAttribute 绑定混合数据
当上传文件同时携带业务参数(如 userId、type、description)时,不能用 @RequestBody(MultipartFile 不支持 JSON 反序列化),应统一用 @ModelAttribute:
- 定义请求模型类,字段包含
MultipartFile file和其他普通字段(如Long userId) - 用 Lombok 的
@Getter/@Setter减少模板代码 - 控制器方法签名示例:
public ResponseEntity<Result> upload(@ModelAttribute UploadRequest req)
配置 multipart 解析器和大小限制
Spring Boot 2.0+ 默认已自动配置 StandardServletMultipartResolver,但需显式设置上传限制:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 在
application.properties中添加:spring.servlet.multipart.max-file-size=10MBspring.servlet.multipart.max-request-size=10MB - 若需更精细控制(如内存阈值),可自定义
MultipartConfigElementBean - 注意:单位支持
KB、MB,不写单位默认为字节
服务层做校验与存储分离
控制器只负责接收和转发,真正逻辑下沉到 service:
立即学习“Java免费学习笔记(深入)”;
- 检查
file.isEmpty()、file.getSize()是否超限 - 验证
file.getContentType()(如只允许image/jpeg、application/pdf) - 生成唯一文件名(推荐用 UUID + 原后缀),避免覆盖或路径遍历
- 保存方式按需选择:本地磁盘(
file.transferTo())、MinIO、阿里云 OSS 或 S3 - 元数据(如文件名、大小、URL、归属用户)应单独存入数据库
Postman 测试要点
调试阶段务必确认前端发送格式与后端预期一致:
- 请求方法选
POST,URL 填接口地址(如/api/v1/files/upload) - Body →
form-data,Key 填字段名(如file、userId),Value 对应选择文件或输入文本 - 不要手动设置
Content-Type—— Postman 会自动生成带 boundary 的multipart/form-data - 响应状态码应明确:200 成功、400 文件为空/类型不符、413 请求体过大、500 存储失败

















