首页 > 其他分享 >FormData传输JSON同时上传单个/多个文件问题

FormData传输JSON同时上传单个/多个文件问题

时间:2024-04-24 10:00:12浏览次数:25  
标签:files FormData json fileList JSON 传单 config formData append

背景

最近在开发一个功能时,涉及到向后端接口发送:

  • JSON请求参数
  • 多个文件
    刚开始想通过RequestBody(application/json)形式进行传值,但是文件不好处理。有一个通过application/json传输文件数据的方法,就是将文件转成base64,然后在后端进行处理。但是这种方式涉及到大文件传输的时候,转成base64会消耗过多成本

于是找来找去找到按form表单的形式提交请求参数(按理来说本该如此),但是如何传输json数据倒变成了一个问题,直到找到这么一个文档,参考之后解决了目前的问题。
https://springdoc.cn/spring-file-upload-json/

解决历程

  1. 后端接口:
    @PostMapping("/creation")
    public void testFormData(@RequestPart("files") MultipartFile[] files,
                                 @RequestPart("dto") Dto dto
    ) {
        System.out.println("hello a shuge");

        String jsonStr = JSONUtil.toJsonStr(dto);
        System.out.println(jsonStr);

        for (MultipartFile file : files) {
            System.out.println(file.getOriginalFilename());
            System.out.println(file.getName());
        }

    }

注意到,上面testFormData方法中的请求参数 使用的注解 是:@RequestPart

  1. 前端请求
function handleFileUpload(event) {
// 在这里构造上传要用的fileList
    const files = event.target.files;
    if (files) {
        for (let i = 0; i < files.length; i++) {
            if (fileList.length < 20 && files[i].type.includes('image')) {
                fileList.push(URL.createObjectURL(files[i]));
            }
        }
    }
}

    let formData = new FormData();
    let request = {}; // json数据
// fileList是上面方法中fileList.push(URL.createObjectURL(files[i]));添加的元素
    for (let key in fileList) {
        formData.append('files', new Blob(fileList), 'files'); // 往formData中添加blob数据,这里涉及到append另外一个用法
    }

    // 注意下面:设置json数据时候,第三个参数指定此时set的数据是application/json类型
    formData.set('dto', new Blob([JSON.stringify(request)], { type: 'application/json' }));

    // 遍历formData,打印到console
    for (var pair of formData.entries()) {
        console.log(pair[0] + ', ' + pair[1]);
    }
    UploaderApi.publishProduct(formData)
        .then((res) => {
            if (res.success) {
               console.log("success");
            } else {
               console.log("failed");
            }
        })
        .catch((err) => {
           console.log("error");
        });

http.interceptors.request.use(
    (config) => {
        // 在发送请求之前做些什么
        if (config.method === 'post') {
            // 这里处理上传文件的请求
            if (config.headers['Content-Type'] === 'multipart/form-data') {
                const formData = new FormData();
                // 构造新的formData(如果不需要添加reqId/stamp)那这步就可以省略了,直接config.data=formData就行
                for (var pair of config.data.entries()) {
                    formData.append(pair[0], pair[1]);
                }
                formData.append('requestId', reqId);
                formData.append('stamp', RequestUtil.generateTimestamp());
                config.data = formData;
            } else {
                config.headers['Content-Type'] = 'application/json;charset=utf-8';
                config.data = {
                    ...config.data,
                    requestId: reqId,
                    stamp: RequestUtil.generateTimestamp(),
                };
            }
        }
        return config;
    },
    (error) => {
        // 对请求错误做些什么
        return Promise.reject(error);
    },
);

请求参数实例

以上,就可以通过axios请求后端接口传输 json字符串+多文件

注意

涉及到的内容

  • SpringBoot中@RequestPart的用法
  • 前端FomrData.append与set的区别
  • 通过将requestBody以contentType=application/json形式写入formData中(里面其实是blob类型数据)

标签:files,FormData,json,fileList,JSON,传单,config,formData,append
From: https://www.cnblogs.com/LinKinSJ/p/18154434

相关文章

  • 【实用技巧】JSON格式转换方式
    1 前言对接开发中,常遇到的就是报文转换。比如从淘宝或者京东拉取订单,亦或是各个公司内部的WMS、OMS等交互,都涉及到格式转换。而大多的格式基本上都是JSON格式,当然也有一些老的SAP交互用的是XML格式的,还有一小部分webService接口也是用的XML格式。那我们这节就看看JSON......
  • Fastjson的toString链分析
    前言之前分析过Fastjson的getter链,忽略了toString链,现在补上,最终也是任意调用getter攻击测试packageorg.example;importcom.alibaba.fastjson.JSONObject;importcom.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;importcom.sun.org.apache.xalan.inte......
  • 详细分析Java中的@JsonFormat注解和@DateTimeFormat注解
    @DateTimeFormat(pattern="yyyy-MM-ddHH:mm:ss")@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")privateDatecreated_on;在前后端数据交互的过程中,Data类型的数据经常会出现类型映射转换的错误,为了达到业务的目标时间格式,通常会使用@JsonFormat和@DateTi......
  • JS基础(二)运算符、流程控制语句、数组对象、JSON对象、Date对象、Math对象、Function对
    一运算符<script>//算数运算符//(1)自加运算varx=10;//x=x+1;//x+=2;varret=x++;//先赋值再计算:x+=1//varret=++x;//先计算再赋值:x+=1console.log(x)......
  • 模块与包、json模块
    【一】模块与包介绍【1】什么是模块在Python中,一个py文件就是一个模块,文件名为xxx.py,模块名则是xxx,导入模块可以引入模块中已经写好的功能。如果把开发程序比喻成制造一台电脑编写模块就像是在制造电脑的零部件准备好零件后,剩下的工作就是按照逻辑把它们组装到一起。将......
  • 使用js语文json字符串通过get方式传值,然后用request接收
    在JavaScript中,如果你有一个JSON字符串,并且你想通过GET请求或者其他HTTP请求来传递这个字符串,你可以使用encodeURIComponent函数来确保字符串能够安全地通过URL传输。//假设我们有一个JSON对象constjsonObject={name:"John",age:30,city:"NewYork"};//将......
  • fastjson导致的程序崩溃:A fatal error has been detected by the Java Runtime Enviro
    ##AfatalerrorhasbeendetectedbytheJavaRuntimeEnvironment:##EXCEPTION_ACCESS_VIOLATION(0xc0000005)atpc=0x000001da4d3ab6b3,pid=15996,tid=0x0000000000006478##JREversion:Java(TM)SERuntimeEnvironment(8.0_361)(build1.8.0_361-b09)......
  • StreamJsonRpc.ConnectionLostException 在请求完成之前, 与远程方的 JSON-RPC 连接已
    今天电脑重启之后,发现visualstudio2022的智能提示与报错经常性不好用,不光不能在正常时候提示代码错误信息,甚至在编译过后也不提示错误。反复重启,刚开始正常,隔一会儿就会提示什么什么功能不可用,点开打开详情,提示:StreamJsonRpc.ConnectionLostException:在请求完成之前,与远......
  • json模块
    【一】什么是序列化将Python中的字典、列表、元组...转换成字符串类型如果使用str强制转换数据类型,造成的后果就是转换后的字符串无法转回Python对象【二】什么是反序列化将字符串类型的数据转换成Python对象(列表、字典、元组...)能将python对象转为字符串-->字符串......
  • Golang一日一库之gjson
    官网https://github.com/tidwall/gjson一简介gjson实际上是get+json的缩写,用于读取JSON串二使用1.安装gogetgithub.com/tidwall/gjson2.使用packagemainimport("fmt""github.com/tidwall/gjson")funcmain(){json:=`{"name":{......