带有多部分请求的 Spring Boot 不受支持的媒体类型

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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服务器代码(/上传功能)。我无法让它正常工作。谢谢

以上是关于带有多部分请求的 Spring Boot 不受支持的媒体类型的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot REST 多部分请求(文件 + json)抛出 415 Unsupported Media Type 异常

当前请求不是多部分请求 Spring Boot 和 Postman(上传 json 文件加上额外字段)

Spring Boot 2 和 OAuth2 客户端凭据不受支持的授权类型

多部分表单数据输入 Java 模型属性未在请求类中注入元素 - Spring Boot

Spring Boot 中使用 @Transactional 注解配置事务管理

带有 JSON 的 Spring MVC 多部分请求