Angular HttpClient Post 两个文件 (Multipart/form-data)
Angular HttpClient Post Two Files (Multipart/form-data)
我有一个 Java Spring 引导控制器,它接受两个 MultipartFile 请求参数。我已经通过 Swagger 和 Postman 测试了这个端点并且它有效。界面如下:
@RequestMapping(value = "/start/", method = RequestMethod.POST)
ResponseEntity<String> startSim(@RequestParam("scenario") MultipartFile scenarioFile, @RequestParam MultipartFile probabilityFile);
在 Angular 中,我已将代码单独添加到 select/upload 文件中,我将这些代码作为名为 configFile 和 parameterFile 的私有变量存储在我的 app.component.ts 文件中,如下所示:
uploadConfigFile(e) {
const reader = new FileReader();
const file = e.target.files[0];
this.configFile = file;
// reader.onload = () => {
// this.configFile = reader.result;
// };
// reader.readAsBinaryString(file);
}
uploadParameterFile(e) {
const reader = new FileReader();
const file = e.target.files[0];
this.parameterFile = file;
// reader.onload = () => {
// this.parameterFile = reader.result;
// };
// reader.readAsBinaryString(file);
}
如何使用 post 方法发送两个文件?
startSim(e) {
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'multipart/form-data'
})
};
console.log(this.configFile);
console.log(this.parameterFile);
// const formData = new FormData();
// formData.append('scenarioFile', this.configFile);
// formData.append('probabilityFile', this.parameterFile);
//
// console.log(formData);
const params = new HttpParams();
params.append('scenarioFile', this.configFile);
params.append('probabilityFile', this.parameterFile);
const result = this.http.post(this.startURL, params, httpOptions);
result.subscribe(json => console.log(json));
}
我试过使用 FormData 和 HttpParams 发送请求。
更新
在更新我的休息控制器以获取 MultipartFile[]:
后,我能够使用表单数据选项
ResponseEntity<String> startSim(@RequestParam("configList") MultipartFile[] configList);
我也摆脱了 HttpOptions 并让内容类型自动设置:
// Removed
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'multipart/form-data'
})
};
您可以使用这些方法发送多个文件:
1.) JSON.stringify
const list = [
{ scenarioFile: this.configFile },
{ probabilityFile: this.parameterFile }
];
const formData = new FormData();
formData.append("configList", JSON.stringify(list));
2.) 或附加相同的 formData 键
Reference: https://developer.mozilla.org/en-US/docs/Web/API/FormData/append
As with regular form data, you can append multiple values with the same name
const formData = new FormData();
formData.append('configList', this.configFile);
formData.append('configList', this.parameterFile);
console.log(formData.getAll('configList')); // Shows the content of configFile and parameterFile
然后您可以继续您的 http post 调用:
this.http
.post(this.startURL, formData, httpOptions)
.subscribe(json => console.log(json));
我有一个 Java Spring 引导控制器,它接受两个 MultipartFile 请求参数。我已经通过 Swagger 和 Postman 测试了这个端点并且它有效。界面如下:
@RequestMapping(value = "/start/", method = RequestMethod.POST)
ResponseEntity<String> startSim(@RequestParam("scenario") MultipartFile scenarioFile, @RequestParam MultipartFile probabilityFile);
在 Angular 中,我已将代码单独添加到 select/upload 文件中,我将这些代码作为名为 configFile 和 parameterFile 的私有变量存储在我的 app.component.ts 文件中,如下所示:
uploadConfigFile(e) {
const reader = new FileReader();
const file = e.target.files[0];
this.configFile = file;
// reader.onload = () => {
// this.configFile = reader.result;
// };
// reader.readAsBinaryString(file);
}
uploadParameterFile(e) {
const reader = new FileReader();
const file = e.target.files[0];
this.parameterFile = file;
// reader.onload = () => {
// this.parameterFile = reader.result;
// };
// reader.readAsBinaryString(file);
}
如何使用 post 方法发送两个文件?
startSim(e) {
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'multipart/form-data'
})
};
console.log(this.configFile);
console.log(this.parameterFile);
// const formData = new FormData();
// formData.append('scenarioFile', this.configFile);
// formData.append('probabilityFile', this.parameterFile);
//
// console.log(formData);
const params = new HttpParams();
params.append('scenarioFile', this.configFile);
params.append('probabilityFile', this.parameterFile);
const result = this.http.post(this.startURL, params, httpOptions);
result.subscribe(json => console.log(json));
}
我试过使用 FormData 和 HttpParams 发送请求。
更新
在更新我的休息控制器以获取 MultipartFile[]:
后,我能够使用表单数据选项 ResponseEntity<String> startSim(@RequestParam("configList") MultipartFile[] configList);
我也摆脱了 HttpOptions 并让内容类型自动设置:
// Removed
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'multipart/form-data'
})
};
您可以使用这些方法发送多个文件:
1.) JSON.stringify
const list = [
{ scenarioFile: this.configFile },
{ probabilityFile: this.parameterFile }
];
const formData = new FormData();
formData.append("configList", JSON.stringify(list));
2.) 或附加相同的 formData 键
Reference: https://developer.mozilla.org/en-US/docs/Web/API/FormData/append
As with regular form data, you can append multiple values with the same name
const formData = new FormData();
formData.append('configList', this.configFile);
formData.append('configList', this.parameterFile);
console.log(formData.getAll('configList')); // Shows the content of configFile and parameterFile
然后您可以继续您的 http post 调用:
this.http
.post(this.startURL, formData, httpOptions)
.subscribe(json => console.log(json));