如何将 Angular 中的多个文件作为 FormData 发送到 Spring Boot as MultipartFile[]?
How to send multiple files from Angular as FormData to Spring Boot as MultipartFile[]?
我下面的代码用于单个文件上传,但我试图将多个文件从 Angular 发送到 Spring 同时启动。在 Spring Boot 中将多个表单数据发送到 ArrayList 会导致 null
,而我无法在 Spring Boot 中 @RequestParam
发送单个表单数据,因为从 Angular 是动态的(由用户定义)。有人可以帮忙吗?
Spring 引导控制器:
@PostMapping("/jobAdApplication")
public void jobAdApplication (@RequestParam("files") MultipartFile[] files,
@RequestParam("candidateName") String candidateName) {
(...)
}
Angular分量:
selectedFiles!: FileList;
file!: file;
(...)
if (this.selectedFiles) {
let file: File | null = null;
const formData: FormData = new FormData();
for (let i = 0; i < this.selectedFiles.length; i++) {
file = this.selectedFiles.item(i);
if (file) {
formData.append(`file${i}`, file);
}
}
formData.append('candidateName', this.applyFormGroup.get('name')?.value);
this.fileService.uploadFile(formData).subscribe({
next: response => {
alert('Files sent successfully')
this.applyFormGroup.reset();
},
error: err => {
alert(`Error: ${err.message}`);
}
});
this.selectedFiles = undefined;
}
Angular 服务:
uploadFile(jobAdApplication: FormData): Observable<any> {
return this._http.post<any>(`${this.jobCandidateUrl}/jobAdApplication`, jobAdApplication);
}
selectedFiles!: FileList
不是必须是可迭代的吗?像数组?然后 for (of) 循环也应该更改为访问索引 [i]
处的文件。如果它是一个对象,比如地图,您可以使用 for (in) 循环并使用 Object.entries.
获取项目
你能在 POST 之前控制台登录 jobAdApplication
吗?我只是好奇数据结构是什么样的。
如果没问题,请查看如何追加文件。
控制器需要参数文件中的 MultipartFile 数组。
@RequestParam("files") MultipartFile[] files
但是在这里您将它们附加到具有变化索引的文件中。
formData.append(`file${i}`, file);
而是保留它们的命名文件,以便控制器可以访问正确的内容。
formData.append('files', file);
我下面的代码用于单个文件上传,但我试图将多个文件从 Angular 发送到 Spring 同时启动。在 Spring Boot 中将多个表单数据发送到 ArrayList 会导致 null
,而我无法在 Spring Boot 中 @RequestParam
发送单个表单数据,因为从 Angular 是动态的(由用户定义)。有人可以帮忙吗?
Spring 引导控制器:
@PostMapping("/jobAdApplication")
public void jobAdApplication (@RequestParam("files") MultipartFile[] files,
@RequestParam("candidateName") String candidateName) {
(...)
}
Angular分量:
selectedFiles!: FileList;
file!: file;
(...)
if (this.selectedFiles) {
let file: File | null = null;
const formData: FormData = new FormData();
for (let i = 0; i < this.selectedFiles.length; i++) {
file = this.selectedFiles.item(i);
if (file) {
formData.append(`file${i}`, file);
}
}
formData.append('candidateName', this.applyFormGroup.get('name')?.value);
this.fileService.uploadFile(formData).subscribe({
next: response => {
alert('Files sent successfully')
this.applyFormGroup.reset();
},
error: err => {
alert(`Error: ${err.message}`);
}
});
this.selectedFiles = undefined;
}
Angular 服务:
uploadFile(jobAdApplication: FormData): Observable<any> {
return this._http.post<any>(`${this.jobCandidateUrl}/jobAdApplication`, jobAdApplication);
}
selectedFiles!: FileList
不是必须是可迭代的吗?像数组?然后 for (of) 循环也应该更改为访问索引 [i]
处的文件。如果它是一个对象,比如地图,您可以使用 for (in) 循环并使用 Object.entries.
你能在 POST 之前控制台登录 jobAdApplication
吗?我只是好奇数据结构是什么样的。
如果没问题,请查看如何追加文件。
控制器需要参数文件中的 MultipartFile 数组。
@RequestParam("files") MultipartFile[] files
但是在这里您将它们附加到具有变化索引的文件中。
formData.append(`file${i}`, file);
而是保留它们的命名文件,以便控制器可以访问正确的内容。
formData.append('files', file);