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

Posted

技术标签:

【中文标题】如何在多部分/表单数据请求中发送对象而不在 Angular 中转换为字符串【英文标题】:How to send Object in a multipart/form-data request without converting to string in Angular 【发布时间】:2020-01-15 22:51:10 【问题描述】:

我必须在“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 对象中接收。所以我的 spring 方法定义应该是 List。同样,这里的元数据是包含键和值的对象。

在 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 尝试了不同的方法,但没有任何结果。根据我的理解,我认为当我在从角度发送时将元数据转换为字符串,因此我能够在字符串对象中接收它。

但在 FormData 中,我没有任何选项可以直接附加对象,因为它允许字符串或 Blob。 有没有其他方法可以发送多部分对象而不转换为角度字符串? 或者 即使我们使用 FormData 发送对象,我们如何才能在 Java 类中接收对象,即 Spring Boot 应用程序中的列表?

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

【问题讨论】:

【参考方案1】:

对我有用的是:

@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> 

所有注解参数都是String常量。

顺便说一句,这是在 kotlin 中。

【讨论】:

当参数为 String 时,它也适用于我,但我希望我的参数作为 Java 自定义对象,因为 multipart 支持发送对象。但是我在某个地方发现 Angular 2 中的 FormData 限制了以字符串或 Blob 发送多部分请求。

以上是关于如何在多部分/表单数据请求中发送对象而不在 Angular 中转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在邮递员的同一请求中发送多部分/表单数据和嵌套 json?

如何将 UIButton 的 rx_tap 直接转换为网络请求,而不在嵌套订阅中发送请求?

使用 AJAX + 多部分表单数据 + UTF-8 编码发送文件和文本

如何在名册中添加联系人而不在 xmpp 聊天中发送和接受订阅请求

如何模拟Zend Form提交而不在Zend Framework 2/3中显示表单?

axios发送post请求,如何提交表单数据?