从Eclipse转战AndroidStudio已经有两个月了。先夸夸Google亲儿子的强大吧,各种方便就不一一道来了。主要是现在的Android阵营已经不想前两年了。各种开源框架开源库。也正是如此,AndroidStudio导入开源的项目非常方便。自从Google源生不推荐使用HttpClient后就不能愉快使用Async-Http了。既然已经转战AndroidStudio,那就还是怪怪的使用新技术开发。Retrofit2+RxJava目前很火。理解起来也不难。但是上手确实各种坑。
今天就记录一下踩过的坑吧。最近在做一个上传数据的项目。虽然项目不大,但为了最求完美,也是为了熟悉新技术,直接选用了Retrofit2+RxJava进行开发。经过数周的学习,渐渐地了解了Retrofit2+RxJava组合起来的运作。可到文件上传部分时各种问题。网上的资料根本不齐,东拼西凑的算是看完了上传的流程。
也和一般的请求一样,先写网络接口,这里就只帖代码。
一、单文件上传
1、接口部分。网上搜出来的一般就是上边的用法。但是蛋疼的是!!!只能固定的名字上传!什么鬼!!!只能固定名字上传还怎么玩,所以推荐使用第二种方法,写起来也只多以上代码。
这里讲一下第一个接口中@Part里边的“file”和“filename”,“file”就是你的网络接口里边给你上传文件的时文件的字段,就类似于后边macAddress字段一个意思,服务器会把你的这个文件解析到“file”字段里边去。“filename”就是你这个文件上传到服务器的名字。
单文件上传的话最终推荐使用第二个接口。
2、代码实现。代码实现部分就很简单了,直接上图。
这里直说一下需要注意的地方,在构造MultipartBody.Part对象的三个参数,其实参数SDK中有说明,这里还是讲一下,其实就是和第一接口一样,第一个参数是字段,第二个参数是名字,把“1.txt”换成了这个文件的名字。
两个接口中后边的:@Query("macAddress") String macAddress
就是服务器要求的一个参数,这里关于接口的参数可以网上查,
二、多文件上传
来了,坑来了。网上写的方法实话传不上去,后边携带的macAddress服务器都有打印,就是接收不到文件。
下面就在讲一下踩过的坑。
1、接口部分。是不是和单文件很像,是不是很简单。这里就不多讲了。
2、代码实现。直接贴代码,看清楚图片中划出的重点。
网上的代码贴出来的是我注视掉的代码,是上传不上的。
下面在说一下这段代码的含义吧,其实就是建立了一个Map,里边装载着你要上传的文件对象,
为何网上的代码无法上传,来一张图贴出开立马就能发现问题。(为啥我第一时间没有发现!/捂脸 /尴尬)
怎么样?这张图眼熟吧。没错就是单文件上传中有缺陷的接口。看出玄机了吧,这个在@Part的“filename”是没有"\""
这玩意儿的。也正因为网上的代码中加了这玩意儿,而不是直接在“filename”后边跟的文件名字。所以导致死活传不上去。经过个吧小时的调试才把这个搞完,服务器端的程序也是我自己写的,如果大家想了解的话不妨加我微信公众吧,虽然服务端写的很简单,但对于初学者来学习Retrofit2+RxJava上传文件是搓搓有余的,也不至于各种资料找不到。