一、问题背景
这个问题困扰了我一上午,搜索了很多博客,发现网上的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才是永久的,我要继续捉虫去了。