在retrofit2中,多表单上传需要同时使用@Multipart和@POST,同时在输入参数中用@Part标记参数。
网上很多资料都是这样说的,但是依然很困惑,到底怎么用多表单上传数据呢?
这里首先要看下表单的报文结构:
如果之前已经了解过表单格式,可知每个boundary所分割的都是一个表单结构。其中请求体中由(1)、(2)所组成的表单1一般用于描述表单,由(3)、(4)、(5)组成的表单2则用于上传文件;如果是多个文件,则从表单2~表单N的结构都和表单2相同。
如上述的报文,在retrofit2中应该写成:
@Multipart
@POST("/upload")
Observable<String> upload(@Part("interactionFile") RequestBody firstBody, @Part MultipartBody.Part file);
在这里,第一个参数RequestBody对应表单1,第二个参数Multipart.Body对应表单2
其中,第一个参数中@Part("xxx")中用于设置上图(1)中的name值。另外,使用Multipart.Body后,其对应的@Part注解中不能设置参数。
再看看对应的参数应该如何生成。
第一个参数:
RequestBody firstBody = RequestBody.create( MediaType.parse("multipart/form-data"), "test")
这里需要将body的类型设置为"multipart/form-data",这样在表单1中的content-type就会被设置为multipart/form-data;后面的参数用于描述表单,对应图中(2)的位置
第二个参数:
Bitmap b = xxxx;//获取一个bitmap
ByteArrayOutputStream stream = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
RequestBody body = RequestBody.create(MediaType.parse("image/png"), byteArray);//content-type为image/png,其中byteArray中的数据对应图中(5)处
MultipartBody.Part file = MultipartBody.Part.createFormData("interactionFile", "test.png", body);//分别对应图中(3)、(4)
以上是基本例子。
至于多文件上传,可以参考这里,用法大同小异:http://blog.csdn.net/jdsjlzx/article/details/51649382
MultipartBody也可以通过自定义converter来转换:http://chuansong.me/n/365421237869