You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:25:27