上传文件和JSON时 @RequestBody和Multipart不能同时存在的解决办法

2024-06-13 19:08

本文主要是介绍上传文件和JSON时 @RequestBody和Multipart不能同时存在的解决办法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这两天有这么一个需求,有一个接口,会同时上传JSON和文件,众所周知,SpringBoot里的参数接收JSON的时候可以在参数前加@RequestBody将JSON映射成我们需要的对象或者MAP等类型

举个栗子
image.png
像图上所示,在参数map前加上@requestBody即可将数据映射成Map,这时候如果需要在上传JSON的同时上传文件呢?目前我发现的是有两种解决方案

  1. 第一种就是将数据格式改为String,然后在参数前加@RequestParam,收到参数后在方法里面通过JSON对象强转为我们所需要的类型,具体参考我之前写的一篇文章
  2. 上面这种方式即可应对一般的需求,但是如果说需求比较特殊,比如说我现在遇到的,接口可能会收到JSON数据,这时我们可以通过@RequestBody接收,但也可能会收到文件加JSON数据的形式,既然@RequestBody不能和Multipart同时用,那我们需要怎么办呢?
    这时候第二种方法就上线了,我们可以将参数修改为HttpServletRequest,通过HttpServletRequest来获取参数,再举个栗子
    image.png
    (Utils.read是工具类里的方法,内容如下)
public static String read(Reader reader) {if (reader == null) {return null;} else {try {StringWriter writer = new StringWriter();char[] buffer = new char[4096];boolean var3 = false;int n;while(-1 != (n = reader.read(buffer))) {writer.write(buffer, 0, n);}return writer.toString();} catch (IOException var4) {throw new IllegalStateException("read error", var4);}}}

如图所示,我们使用了HttpServletRequest来接收参数,首先我们先获取param参数,如果参数为空,说明是以Body形式提交的数据,所以我们获取一下body的数据,最后强制转换成我们需要的类型,如果param不为空的时候,我们就要获取文件了
image.png
通过HttpServletRequest获取文件的代码如下,这样我们就实现了一个接口既可以接收JSON类型,也可以接收文件+JSON类型的功能了。

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile file = multipartRequest.getFile("file");

PS:刚开始写博客,语言组织能力实在是有点差劲,如果你也遇到类似的问题并在看完我写的博客后仍无法解决,请留言,我会在第一时间回复与你一起解决问题。

这篇关于上传文件和JSON时 @RequestBody和Multipart不能同时存在的解决办法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1058170

相关文章

input的accept属性让文件上传安全高效

《input的accept属性让文件上传安全高效》文章介绍了HTML的input文件上传`accept`属性在文件上传校验中的重要性和优势,通过使用`accept`属性,可以减少前端JavaScrip... 目录前言那个悄悄毁掉你上传体验的“常见写法”改变一切的 html 小特性:accept真正的魔法:让

java对接Pinata上传文件到IPFS全过程

《java对接Pinata上传文件到IPFS全过程》本文详细介绍了如何使用PinataAPI将文件上传到IPFS网络,首先登录Pinata官网并生成JWT令牌,然后在项目中导入OkHttp依赖并编写代... 目录1.登录2.生成令牌3.导入依赖4.编写代码5.调用接口调试China编程代码总结Pinata调用AP

Python包管理工具uv下载python版本慢问题解决办法

《Python包管理工具uv下载python版本慢问题解决办法》uv是一个非常快的Python包和项目管理器,用Rust编写,使用热缓存安装Trio的依赖项的速度对比,:本文主要介绍Python包... 目录发现问题对于 MACOS / linux 用户 (zsh/bash):对于 Windows 用户:总

MySQL 中的 JSON_CONTAIN用法示例详解

《MySQL中的JSON_CONTAIN用法示例详解》JSON_CONTAINS函数用于检查一个JSON文档中是否包含另一个JSON文档,这篇文章给大家介绍JSON_CONTAINS的用法、语法、... 目录深入了解 mysql 中的 jsON_CONTAINS1. JSON_CONTAINS 函数的概述2

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

Vue3 如何通过json配置生成查询表单

《Vue3如何通过json配置生成查询表单》本文给大家介绍Vue3如何通过json配置生成查询表单,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录功能实现背景项目代码案例功能实现背景通过vue3实现后台管理项目一定含有表格功能,通常离不开表单

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv