retrofit2中的多表单(from-data)上传

在retrofit2中,多表单上传需要同时使用@Multipart和@POST,同时在输入参数中用@Part标记参数。

网上很多资料都是这样说的,但是依然很困惑,到底怎么用多表单上传数据呢?


这里首先要看下表单的报文结构:

retrofit2中的多表单(from-data)上传_第1张图片

如果之前已经了解过表单格式,可知每个boundary所分割的都是一个表单结构。其中请求体中由(1)、(2)所组成的表单1一般用于描述表单,由(3)、(4)、(5)组成的表单2则用于上传文件;如果是多个文件,则从表单2~表单N的结构都和表单2相同。


如上述的报文,在retrofit2中应该写成:

    @Multipart
    @POST("/upload")
    Observable 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

你可能感兴趣的:(retrofit2中的多表单(from-data)上传)