如何在 Spring Boot 中实现每个文件都有额外字段的多个文件上传

duc*_*com 5 java spring spring-boot

如何在Spring Boot中实现多个文件上传功能,每个文件都有自己的额外字段(例如comment,documentType)?

这个答案可能相关,但仅适用于单个文件: Spring boot controller - Upload Multipart and JSON to DTO

hov*_*yan 2

您可以在有效负载中编码多个请求部分POST,并使用 Spring Boot 对其进行处理。

假设您需要为每个文件传递两件事:

  • Blob与文件内容
  • metadata- 一个可以容纳任何内容的对象 - 标题/评论 - 你能想到的。

前端

你可以使用任何东西来模拟FormData参数,这是在 TypeScript 中:

假设一个文档如下所示:

export interface NewDocument {
  title: string,
  comment: string,
  author: string,
  file: File
}
Run Code Online (Sandbox Code Playgroud)

所以 FormData 的生成可能是这样的:

private getFormData(doc: NewDocument): FormData {
  let formData: FormData = new FormData();
  const json: Blob = new Blob([JSON.stringify(doc)], {type: 'application/json'});
  formData.append('metadata', json); //adding the metadata
  const blob: Blob = new Blob([doc.file[0]], {type: doc.file[0].type});
  formData.append('file', blob); //adding the file contents
  return formData;
}
Run Code Online (Sandbox Code Playgroud)

然后您可以将POST表单数据发送到给定端点。

后端

RequestParts您可以在请求中指定您期望的不同内容

@PostMapping
public ResponseEntity<Void> uploadFile(@RequestPart("metadata") FileMetadata metadata,
@RequestPart("file") MultipartFile file) {
   //process
}
Run Code Online (Sandbox Code Playgroud)

FileMetadata这是一个自定义 Java POJO,您可以将前端的 JSON 表示反序列化到其中NewDocument

您应该能够将其转换为多个版本。

@PostMapping
public ResponseEntity<Void> uploadFile(@RequestPart("metadata") FileMetadata[] metadatas,
@RequestPart("file") MultipartFile[] files) {
   //process
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是如何识别哪个元数据属于哪个文件。

一种简单的方法是将文件名编码在元数据对象中,并将其用于映射。