当请求类型是octet-stream时,SpringBoot 如何完成文件上传

一、问题背景

这个问题困扰了我一上午,搜索了很多博客,发现网上的springboot都是使用Multipart来接收文件,而客户端使用的是binary,用二进制流来上传文件的,下面记录一下我的解决历程。

二、基础知识

一个请求的参数往往可以在url,headers以及body里面,这里我们只研究body里面的参数,如下图body可以有下面几种形式,我们来比较一下form-data和binary。
在这里插入图片描述
form-data:它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。
binary:相当于Content-Type:application/octet-stream,从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。

经过对比,我依然觉得form-data更好用,而且springboot官方也默认使用与之对应的multipart来完成文件上传的,可惜客户端用的是binary。能不改就不改吧,谁让我不想麻烦别人呢。

三、解决过程

我一直在思考,使用multipart上传文件,其实不过是将流进行封装,道理都是一样的。所以我就研究了使用multipart的时候,最关键的函数,transferTo(dest),这个函数就是把MultipartFile的文件流保存到本地路径dest,按住ctrl,点进去看看,结果发现了这个
在这里插入图片描述
所以我只需要想办法获得这个InputStream流,然后使用FileCopyUtils工具集的copy方法,就能把文件保存到本地了,想想就觉得激动,那就开始在Controller里面实现一下吧。
在这里插入图片描述
然后使用postman测试一下:
在这里插入图片描述
在这里插入图片描述

成功了!!

四、结语

这个也不算什么难题,但是这个分析问题,解决问题的过程很有意义。开心是短暂的,调bug才是永久的,我要继续捉虫去了。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值