如何在多部分/表单数据请求中发送对象而不在Angular中转换为字符串

时间:2019-09-14 09:28:41

标签: javascript angular typescript spring-boot multipartform-data

我必须在“ multipart / form-data”请求中传递对象,以便可以在下游应用程序(Java Spring)中将其作为列表(即自定义类对象)接收。元数据对象仅包含键和值

在角度

interface Metadata{
 key:string;
 value:string;
}

在Angular中,我使用FormData创建如下所示的多部分请求。

metadatas = new Array<Metadata>();
// few values added in metadatas array.
 fileToUpload: File ; // contains file information

const formData: FormData = new FormData();
formData.append('file', fileToUpload, fileToUpload.name);
formData.append('metadata',JSON.stringify(this.metadatas))

FormData追加方法定义中所说的“值:字符串| Blob” ,因此我需要使用JSON.stringify()将元数据对象转换为字符串。 但是,当我在Spring应用程序(下游)中执行此操作时,我可以在字符串中接收对象,例如

@PostMapping(path = "/file-upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> fileUpload(
        @RequestParam(name = "metadata", required = false) String metadata,
        @RequestParam(name = "file", required = false) MultipartFile file) {
    System.out.println(metadata);
    System.out.println(file);
    return new ResponseEntity<>("example", HttpStatus.OK);
}

上面的代码可以正常工作并且能够获取元数据和文件数据,但是正如我的API所述,它应该在Java Object中接收。所以我的spring方法定义应该是List。再次在这里,metdata是包含键和值的对象。

在Java

public class Metadata {
private String key;
private String value;
 // getter and setters
}

在下面的代码中,元数据应在列表中捕获

@PostMapping(path = "/file-upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> fileUpload(
        @RequestParam(name = "metadata", required = false) List<Metadata> metadata,
        @RequestParam(name = "file", required = false) MultipartFile file) {
    System.out.println(metadata);
    System.out.println(file);

    return new ResponseEntity<>("example", HttpStatus.OK);

}

我尝试使用@RequestPart和@RequestParam进行各种处理,但没有任何结果。根据我的理解,我认为当我在从angular发送时将元数据转换为字符串时,因此能够在String对象中接收它。

但是在FormData中,我没有任何选择可以直接附加对象,因为它允许使用字符串或Blob。 是否还有其他方法可以发送多部分对象而无需将其转换为有角度的字符串? 即使我们使用FormData发送对象,我们如何也可以在Java类中接收对象,即Spring Boot Application中的列表?

由于这是我的新手,请帮助我获得详细解释的解决方案。

1 个答案:

答案 0 :(得分:0)

对我有用的是:

@PostMapping("/upload_pic")
    fun uploadPic(@RequestParam(IMAGE) image: MultipartFile?,
                  @RequestParam(GROUP_ID) groupId: String,
                  @RequestHeader(DEVICE_ID_HEADER_STRING) deviceId: String,
                  @RequestHeader(TOKEN_HEADER_STRING) authToken: String): ResponseEntity<StatusModel> {

所有注释参数都是字符串常量。

顺便说一句,这是在科特林。