Spring Boot中Postman上传文件+JSON创建Event接口报错求助
解决Spring Boot同时上传文件与JSON数据的接口问题
问题根源
当使用multipart/form-data格式提交请求时,@RequestBody无法直接解析JSON数据——因为此时请求体由多个独立部分组成,JSON是其中一个part,而非整个请求体的内容,这会直接触发HttpMediaTypeNotSupportedException错误。
解决方案
1. 调整Controller接口方法
修改接口参数,用@RequestPart分别接收JSON数据和上传文件:
import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @RestController public class EventController { private final EventService eventService; // 构造注入Service public EventController(EventService eventService) { this.eventService = eventService; } @PostMapping(value = "/events", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public Event createEvent(@RequestPart("event") Event event, @RequestPart("company_logo") MultipartFile companyLogo) { return eventService.saveEvent(event, companyLogo); } }
2. 确保Event实体类合规
实体类需包含对应业务字段及Getter/Setter(可通过Lombok的@Data注解简化代码):
import lombok.Data; @Data public class Event { private Long id; private String eventName; private String description; private String companyLogo; // 存储文件名或文件访问路径 // 按需添加其他业务字段 }
3. 完善Service层逻辑
在Service中处理文件上传和Event数据持久化:
import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @Service public class EventService { // 文件存储目录(实际项目建议用云存储如OSS) private static final String UPLOAD_DIR = "./uploads/"; public Event saveEvent(Event event, MultipartFile companyLogo) { // 处理文件上传逻辑 if (!companyLogo.isEmpty()) { try { Path uploadPath = Paths.get(UPLOAD_DIR); if (!Files.exists(uploadPath)) { Files.createDirectories(uploadPath); } String fileName = companyLogo.getOriginalFilename(); Path filePath = uploadPath.resolve(fileName); Files.copy(companyLogo.getInputStream(), filePath); // 将文件名存入Event对象 event.setCompanyLogo(fileName); } catch (IOException e) { throw new RuntimeException("文件上传失败", e); } } // 此处添加JPA持久化逻辑,例如 eventRepository.save(event) return event; } }
4. 客户端请求规范
以Postman为例:
- 请求方式选
POST,填写接口URL - Body选择
form-data格式 - 添加两个参数:
- 键为
event,类型选Text,内容填JSON字符串,需给该参数单独设置Content-Type为application/json(在参数的Headers tab中添加) - 键为
company_logo,类型选File,选择要上传的文件
- 键为
补充说明
@RequestPart用于接收multipart请求中的独立部分,支持自动将JSON格式的part解析为Java对象(前提是该part的Content-Type设为application/json)- 若需调整文件大小限制,可在
application.properties中添加:spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB
内容的提问来源于stack exchange,提问作者Vidushika Dasanayka
相关产品推荐
相关产品推荐

