带有多部分请求的 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: false
和processData: 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