javascript - 具有多部分请求的 Spring Boot 不受支持的媒体类型
问题描述
我正在尝试使用多部分 POST 请求将一个文件和两个 json 对象发送到我的 Spring Boot 后端,但我总是得到一个 415 http 响应。这是我已经尝试做的事情的列表:
- 将每个对象作为具有此处建议的内容类型的
Blob
文件发送application/json
- 按照此处
String
的建议发送每个对象 - 按照此处的建议添加
contentType: false
并processData: false
在 ajax 请求中 - 在 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");
}
解决方案
您必须将“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 文件。
推荐阅读
- python - Google Cloud PubSub:未从 Cloud Functions 发送/接收所有消息
- javascript - 给定一个字符串,将每个单词的第一个字母移动到每个单词的末尾,然后在每个单词的末尾添加“ay”并返回一个新字符串 - JavaScript
- ruby-on-rails - Systemd Rails 启动脚本因 rbenv 失败,(code=exited, status=1/FAILURE)
- c++ - 无法在带有 Clang 的模块中使用对齐的“operator new”
- spring - Intellij 中的模块依赖性 - 无法引用其他项目中的类
- javascript - 如何使用 webdriver.io 点击网页上的所有锚元素
- pandas - 用 groupby 添加两列
- python - 如何根据熊猫中的多列得出分数(排名)
- java - Gradle:无法从 12 确定 Java 版本
- javascript - 无需猜测或蛮力即可在贝塞尔曲线上获得一个点