【问题标题】:Spring boot unsupported media type with multipart request带有多部分请求的 Spring Boot 不受支持的媒体类型
【发布时间】:2021-04-09 15:43:14
【问题描述】:

我正在尝试使用多部分 POST 请求向我的 Spring Boot 后端发送一个文件和两个 json 对象,但我总是收到 415 http 响应。以下是我已经尝试过的事情的清单:

  1. 将每个对象作为Blob 文件发送,内容类型为application/json 建议here
  2. 按照建议here 将每个对象作为String 发送
  3. 按照建议here在ajax请求中添加contentType: falseprocessData: false
  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");
    }

【问题讨论】:

    标签: javascript java json spring-boot


    【解决方案1】:

    您必须将“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文件。

    【讨论】:

    • @H.Saul 正如我上面提到的,您是否尝试使用 curl 命令对您的 url 使用 "-v -H "Content-Type:multipart/form-data"" ?
    • 是的,我试过了。但问题出在我在回答中指定的网址本身。
    • 那你怎么说“那也不行”?如果您调用正确的 url,肯定会在 curl 命令上方正常工作。如果你调用了错误的url,那是你的错误,不代表我的回答不起作用。
    • 您建议我尝试在标题中设置 Content-Type。这就是我所做的。那没有用。如果我从一开始就有正确的网址,那么我就不会问这个问题了。
    【解决方案2】:

    我终于找到了为什么我总是从我的 Spring Boot 后端获得415 http response 的原因。

    问题是请求的 url 错误。它指向一个只需要 json 数据而不是多部分的端点。这就是 Spring Boot 返回 Unsupported media type 的原因。

    希望这可以帮助其他人。

    【讨论】:

    • 你能分享你的js(axios)和java服务器代码(/上传功能)。我无法让它正常工作。谢谢
    猜你喜欢
    • 2019-07-01
    • 2015-06-17
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2020-06-26
    • 2021-12-21
    • 1970-01-01
    • 2019-01-16
    相关资源
    最近更新 更多