首页 > 解决方案 > 具有多部分请求的 Spring Boot 不受支持的媒体类型

问题描述

我正在尝试使用多部分 POST 请求将一个文件和两个 json 对象发送到我的 Spring Boot 后端,但我总是得到一个 415 http 响应。这是我已经尝试做的事情的列表:

  1. 将每个对象作为具有此处建议的内容类型的Blob文件发送application/json
  2. 按照此处String的建议发送每个对象
  3. 按照此处的建议添加contentType: falseprocessData: false在 ajax 请求中
  4. 在 Spring Boot 控制器中使用@RequestParam而不是@RequestPart

我错过了什么?

这是请求:

const data = new FormData();
data.append('file', new Blob([file], {type: 'multipart/form-data'}));
data.append('entity1-info', new Blob([JSON.stringify(entity1Object)], {type: 'application/json'}));
data.append('entity2-info', new Blob([JSON.stringify(entity2Object)], {type: 'application/json'}));

return axios({
   method: 'post',
   url: url,
   headers: {'Authorization': `Bearer ${idToken}`},
   data: data,
   contentType: false,
   processData: false
});

这是我在 Spring Boot 中的控制器:

@PostMapping("/upload")
    public ResponseEntity<String> uploadFile(@NotEmpty @RequestPart("file") MultipartFile multipartFile, @NotNull @RequestPart("entity1-info") Entity1 entity1, @NotNull @RequestPart("entity2-info") Entity2 entity2, HttpServletRequest request) {
        log.debug(request);
        ...
        return ResponseEntity.ok("ok");
    }

标签: javascriptjavajsonspring-boot

解决方案


您必须将“Content-Type”设置为标题

Content-Type:multipart/form-data

我正在使用类似于下面的 curl 命令,它工作正常。

curl -v -H "Content-Type:multipart/form-data" -F "entiry1-info=@person1;type=application/json" -F "entiry2-info=@person2;type=application/json" -F "file=@logo.png;type=multipart/form-data" -X POST http://<IP_Address>:8080/api/upload

注意:上面的 person1 和 person2 是 json 文件。


推荐阅读