rest 文件上传需用 multipart/form-data,spring boot 推荐 @requestpart 或 @modelattribute;接口须声明 consumes = mediatype.multipart_form_data_value;需校验空、类型、大小,安全保存并配置全局 multipart 参数。

REST 接口处理文件上传,核心是用 multipart/form-data 编码格式传输数据,后端需正确解析并校验文件内容。Spring Boot 中推荐使用 @RequestPart 或 @ModelAttribute,而非 @RequestParam(仅适合单个简单文件或字符串),尤其当需要同时接收文件和结构化数据(如 JSON)时。
接口定义必须指定 consumes
控制器方法要显式声明 consumes = MediaType.MULTIPART_FORM_DATA_VALUE,否则 Spring 不会启用 multipart 解析器:
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)- 不加该参数,即使前端发的是 multipart 请求,也会报 415 Unsupported Media Type
- 路径设计建议符合 REST 规范,例如
/api/v1/files或/users/{id}/avatar
参数绑定方式选对很关键
根据上传场景选择合适注解:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 只传一个文件:可用
@RequestParam("file") MultipartFile file - 传多个文件:用
@RequestParam("files") MultipartFile[] files或List<multipartfile></multipartfile> - 混合上传(文件 + JSON 对象):必须用
@RequestPart,例如:@RequestPart("user") User user(自动反序列化 JSON)@RequestPart("avatar") MultipartFile avatar - 含文件 + 普通表单字段(如 userId、desc):推荐
@ModelAttribute封装成一个请求模型类,字段含MultipartFile和其他业务字段
服务层要做基础校验和安全处理
不能只依赖前端传值,后端必须主动检查:
- 判空:
if (file.isEmpty()) throw new IllegalArgumentException("文件不能为空") - 校验类型:比对
file.getContentType()或扩展名(如.txt、.jpg),避免伪造 Content-Type - 限制大小:通过配置
spring.servlet.multipart.max-file-size和max-request-size,或代码中手动判断file.getSize() > 10 * 1024 * 1024 - 读取内容要指定编码:文本文件用
new String(file.getBytes(), StandardCharsets.UTF_8),大文件用InputStream流式处理 - 保存时生成唯一文件名(防重名/覆盖),不要直接用
getOriginalFilename()存盘
别忘了全局配置和依赖
Spring Boot 2.0+ 默认已集成 multipart 支持,但需确认以下几点:
- 确保
spring.servlet.multipart.enabled=true(默认开启) - 调整大小限制(application.yml):
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB - 若用旧版 Spring 或需更细粒度控制,可自定义
CommonsMultipartResolverBean - Maven 中无需额外引入 commons-fileupload(Spring Boot 2.0+ 内置 StandardServletMultipartResolver)










