SpringBoot中实现接收文件和对象
作者:LitongZero 发布时间:2022-02-08 10:16:53
SpringBoot接收文件和对象
使用场景:某个接口,需要同时接收文件和实体,也就是参数
一、这个时候,前端就不能json格式传送数据了,要用到multipart/form-data;这种格式传送数据。
二、那么,这个时候,后端应该怎样接收这个参数和文件呢?
1.接收HttpServletRequest,自己处理request(不推荐)
@PostMapping(value = "/upload")
@ResponseBody
public String handleFileUpload(HttpServletRequest request) {
MultipartHttpServletRequest params=((MultipartHttpServletRequest) request);
// 获取文件
List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
// 获取参数
String name=params.getParameter("name");
2.接收实体,将文件放到对象属性中(推荐)
public class UserFileReq {
// 参数
private String username;
// 文件
private MultipartFile file;
// 省略get\set
}
@PostMapping(value = "/upload")
@ResponseBody
public String handleFileUpload(UserFileReq req) {
// 文件和参数 都在实体中了
}
3.接收参数,将文件放到接收参数中
这种方法适合接收单个文件参数,多参数还是建议用对象接收,方便扩展
@PostMapping(value = "/upload")
@ResponseBody
public String handleFileUpload(MultipartFile file) {
}
4.一个坑,使用第二种方法的时候
一定不要加@RequestBody,加了这个注解,就会报如下错误。
{
"timestamp": 1571196217195,
"status": 415,
"error": "Unsupported Media Type",
"exception": "org.springframework.web.HttpMediaTypeNotSupportedException",
"message": "Content type 'multipart/form-data;boundary=2gOOYeFBpE;charset=UTF-8' not supported",
"path": "/file/upload"
}
所以,接收文件,不要使用@RequestBody注解
但是@Validated注解(校验参数的注解)是可以使用的。
SpringBoot接口同时接收JSON数据和文件时遇到的问题
最近公司有一个需求,需要通过一个接口上传处理好的数据,由于数据太复杂,所以就采用了JSON格式提交数据,接口通过@RequestBody获取数据并且映射到对应的对象去,这块需要注意的一个问题就是前端在提交数据的时候需要将HTTP的Headers头里的Content-Type设置成application/json才行,本来写好测试完大功告成了,结果突然又改需求了。。要求在提交数据的时候同时上传一个文件,于是便查询了一下资料,发现@RequestBody对应的类型是application/json,而文件Multipart对应的类型是multipart/form-data,这两种格式不兼容,所以无论怎么写都是调用失败的。
原始代码如下
经过调查发现有两种办法解决问题
首先都是将Content-type类型设置为multipart/form-data;
1.简化参数,将JSON参数抽取出来,参数传递过去后再重新拼接。
2.将@RequestBody修饰的实体参数当做一个JSON字符串传递,传递过去后通过GSON或者FastJSON转换。
因为第二种方法简单,所以采用了第二种方法。
来源:https://blog.csdn.net/LitongZero/article/details/102583161
猜你喜欢
- 1安装eclipse插件步骤,点击help,选择Eclipse Marketplace2.输入Scala,点击go3.选择搜索到的Scala
- 一、前期准备我们要在IDEA上创建一个新的项目,创建好一个项目后,我们需要创建4个包,分别是英雄包,装备包,铭文包,野怪包,皮肤包然后我们就
- 这个例子用于演示在Spring Boot应用中如何验证Web 应用的输入,我们将会建立一个简单的Spring MVC应用,来读取用户输入并使
- 投篮小游戏规则,点击投篮目标点,就会有一个球沿着相关抛物线,然后,判断是否进入篮子里,其实就是一个矩形,直接是按照碰撞检测来的,碰到就算进去
- java实现读取、删除文件夹下的文件package test.com;import java.io.File;import java.io.
- 通过主菜单对各级子菜单进行控制,并实现添加记录,查找记录,删除记录,修改记录,排序记录,以及退出系统功能的实现。一共六部分的功能模块。 上面
- 对于生成的sql语句 自动加上单引号的情况mybatis是这样的,如果表的字段跟系统字段冲突,写sql语句的时候必须得加上单引号,这样才会区
- 一、方法的定义1.方法体中最后返回值可以使用return, 如果使用了return, 那么方法体的返回值类型一定要指定2.如果方法体重没有r
- Kryo框架的source已移至https://github.com/EsotericSoftware/kryo ,进入此页面,然后点击右边
- 目录前言常量池反编译代码验证字符串初始化操作总结前言在深入学习字符串类之前,我们先搞懂JVM是怎样处理新生字符串的。当你知道字符串的初始化细
- 1.代码:import java.math.BigDecimal;import java.text.DecimalFormat;import
- java 中遍历取值异常(Hashtable Enumerator)解决办法用迭代器取值时抛出的异常:java.util.NoSuchEle
- 前言通常在工作中比较常用到的Microsoft Word是属于国外的文档内容编辑软件,其编译技术均属国外。而OFD是一种我国的自主文档格式,
- 树的同构备忘!定义:给定两棵树r1、r2,如果r1可以通过若干次的左子树和右子树互换,使之与r2完全相同,这说明两者同构。举例树的构造树可以
- FeignClient发送post请求异常这个问题其实很基础。但是却难倒了我。记录一下在发送post请求的时候要指定消息格式正确的写法是这样
- 在微信公众号里面需要上传头像,时间比较紧,调用学习jssdk并使用 来不及 就用了input1、使用input:file标签, 去调用系统默
- 前言 短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油,我命由我不由天
- 一、Socket是什么Socket 的中文翻译过来就是“套接字”。套接字是什么,我们先来看看它的英文含义:插座。Socket 就像一个电话插
- 传值就是将实参的值传到所调用的函数里面,实参的值并没有发生变化,默认传值的有int型,浮点型,bo
- 一、前言学习概述:学习四种不同类型的方法应用、方法被调用时的内存图、重载学习目标:熟练掌握方法的应用以及重载二、定义与调用1.概述定义:方法