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

news/发布时间2024/5/9 1:25:27

背景

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

  • 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) {
// 在这里构造上传要用的fileListconst 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,打印到consolefor (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类型数据)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/46648573.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

[dp 小计] SOSdp

复健 SOSdp(sum over subsets dynamic programming)。 引入 令 \(F(x)=\sum\limits_{u\subseteq x} A(u)\) 其中 \(A\) 为给定数组,求出 \(\forall x, F(x)\) 。 思路一 暴力枚举子集,时间复杂度 \(O(4^n)\)。 思路二 优化子集枚举,时间复杂度 \(O(3^n)\)。 思路三 考虑 SOS…

WDS+MDT网络启动自动部署windows(七)添加驱动

简介: 以前的ghost,是封装万能驱动。 现在安装原版ISO,是手动安装驱动。 那么WDS+MDT,怎么装驱动更方便呢? 本来是轻接触,lite touch,通过设置rules,bootstrap,可以达到只选择一下任务序列即可。 那么也要自动安装驱动。 WDS也可以注入驱动,但是是在使用原版安装镜像…

通用目标近似程序的神经加速

通用目标近似程序的神经加速 参考文献链接 https://homes.cs.washington.edu/~luisceze/publications/micro12-web.pdf人工智能芯片与自动驾驶

CMake链接库,会检索库引用头文件路径

当使用CMake,target_link_libraries来链接静态库文件那边的头文件路径时,如果是跨了两层以上(即calculter到common这样),会导致CMake报错。add.h没有找到common.h头文件路径。一般来说,编译时候会对头文件(.h)包含在源文件(.cpp)的头部,这时就会检查链接库的头文件路…

使用ollama分别在我的window、mac、小米手机上部署体验llama3-8b

1、ollama到底是个什么玩意 一句话来说, Ollama 是一个基于 Go 语言开发的简单易用的本地大模型运行框架。可以将其类比为 docker(有类似docker中的一些常规命令list,pull,push,run 等等),事实上确实也制定了类似 docker 的一种模型应用标准,在后边的内容中,你能更加真切…

pwn知识——劫持__malloc_hook(在加入tcache以后)

导论 动调是最好的导师! malloc_hook函数解析 malloc_hook是malloc的钩子函数,在执行malloc时,会先检测__malloc_hook的值,如果malloc_hook的值存在,则执行该地址(值里边表现为十六进制,可以成为地址),也就是说,如果我们成功劫持malloc_hook以后并修改它的值为one_ga…