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

SpringBoot中同时上传文件与发送JSON数据的POST请求问题排查

SpringBoot 同时上传文件+提交数据的正确实现

当然可以同时完成文件上传和相关数据提交,你的问题出在代码注解的混用以及请求配置上,下面是具体的修正方案:

一、修正后端代码

你不能同时使用@RequestPart和@RequestBody,因为文件上传请求是multipart/form-data类型,请求体由多个部分组成,@RequestBody会试图把整个请求体解析为JSON,这和多部分请求冲突。正确的做法是把User参数也用@RequestPart注解:

@RestController
public class FileUpload {

    // 明确指定请求类型为multipart/form-data
    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String register(@RequestPart("file") MultipartFile file, @RequestPart("user") User user) {
        String uploadDirectory = "myDirectory";

        if (file == null || file.isEmpty()) {
            return "file cannot be null or empty";
        }
        try {
            File dir = new File(uploadDirectory);
            if (!dir.exists()) {
                // 用mkdirs()支持多级目录创建,mkdir()只能创建单级
                dir.mkdirs();
            }
            String originName = file.getOriginalFilename();
            System.out.println(originName);

            File destination = new File(uploadDirectory + File.separator + originName);
            if (destination.exists()) {
                return "file with same name already exists";
            } else {
                // 也可以用Files.copy更安全,避免权限问题
                // Files.copy(file.getInputStream(), destination.toPath(), StandardCopyOption.REPLACE_EXISTING);
                file.transferTo(destination);
            }
            return "successfully file uploaded using userID : " + user.getUserid();

        } catch (IOException e) {
            e.printStackTrace();
            return "upload failed";
        }
    }
}

额外注意:

  • 确保User类有完整的getter/setter方法,或者使用Lombok的@Data注解,否则Spring无法将JSON解析为User对象
  • 生产环境建议使用绝对路径作为上传目录,避免相对路径带来的不确定性,比如String uploadDirectory = "/opt/upload-files";

二、Postman 请求配置

按以下步骤配置请求,才能正确触发接口:

  1. 请求方法选择POST,URL填入http://localhost:8080/upload(根据你的端口调整)
  2. 切换到Body标签,选择form-data类型
  3. 新增两个请求部分:
    • 第一个Key填file,类型选择File,然后点击右侧的Select Files选择本地文件
    • 第二个Key填user,类型选择Text,然后在输入框中填入User对象的JSON内容,例如:
      {"userid": 1001, "username": "testUser"}
      
  4. 不需要手动在Headers里添加Content-Type: multipart/form-data,Postman会自动生成正确的请求头

三、常见错误排查

  • 如果依然报错Current request is not a multipart request:检查Postman是否正确选择了form-data,或者请求头是否被手动修改导致冲突
  • 如果User对象解析为null:检查User类的字段名是否和JSON中的键名一致,或者是否缺少getter/setter
  • 如果文件写入失败:检查上传目录是否有写入权限,或者目录路径是否正确

内容的提问来源于stack exchange,提问作者user22410466

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:46:28