retrofit2, rxjava 之图片上传

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy901213/article/details/79472153

今天用retrofit2和rxjava 完成了图片列表的上传,记录下

public interface ApiManager {
@Multipart
@POST(“/user/addCarInfo”)
void addCarInfo(@QueryMap Map

表单提交

很多时候想用表单的方式:

@Multipart
@POST("upload/")
Call<ResponseBody> register(
       @Body RequestBody body
                                   );

Java代码:

   RequestBody requestFile =
RequestBody.create(MediaType.parse("multipart/form-data"), file);

  Call<ResponseBody> call = service.register(body);  
Response<ResponseBody> response = call.execute();

Json提交

上传Json

@POST("/uploadJson")
Observable<ResponseBody> uploadjson(
        @Body RequestBody jsonBody);

upLoadJson 也可以具体指明Content-Type 为 “application/json”格式的

具体组装我们的RequestBody则可以这样:

 RequestBody body= 
               RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), jsonString);

接着可以这样调用:

// 执行请求
Call<ResponseBody> call = service.uploadJson(description, body);
call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call,
                           Response<ResponseBody> response) {
        Log.v("Upload", "success");
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
        Log.e("Upload error:", t.getMessage());
    }
});

}

至于服务器返回什么类型的model, 开发者可以自定义, 譬如你可以把APi 中的 ResponseBody 指定为你自己的javaBean, 当然上层构建Call时候,Callback也必须是 Call<MyBean>

@POST("/uploadJson")
Call<MyBean> uploadjson(
        @Body RequestBody jsonBody);

仔细的朋友会发现有的地方用Call,有的地方用Observable,如果结合了RxJava就是用后者接收了,这里不关乎什么方式。

上面的代码片段中显示的代码初始化(RequestBody 和description), 以及如何使用文件上传API。正如刚开始已经提到的, 从OkHttp 的RequestBody类中,需要两个RequestBody.create()方法

除了Body描述, 必须将添加文件包装成MultipartBody的实例。这就是你需要使用适当的从客户端上传文件到服务端。此外, 您可以添加createFormData中的uploadFile(Uri fileUri)方法,适合相机拍照回来上传图片的场景。

  public static File getFile(Context context, Uri uri) {
    if (uri != null) {
        String path = getPath(context, uri);
        if (path != null && isLocal(path)) {
            return new File(path);
        }
    }
    return null;
}

通过以上代码片段,可以构造自己的file, 其他构建ResquestBody的步骤同上所示,以上案列总有一款适合你的web后端。

设置 Content-Type

请注意设置的内容类型。如果你拦截底层OkHttp客户端和更改内容类型为application / json, 你的服务器可能反序列化过程出现的问题。请确保你没有自定义更改multipart/form-data。

upLoad图片也可以具体指明Content-Type 为 “image/jpg”格式的

   RequestBody requestFile =
            RequestBody.create(MediaType.parse("image/jpg"), mFile);

上传文件到服务端示例

如果你已经有你的后端项目, 您可以依靠下面的示例代码。我们使用一个简单api 上传到服务器。此外我们告诉api 传入参数的请求, 因为我们使用的是Node.js

解析的回调函数,我们记录每个字段来显示其输出。

method: 'POST', 
 path: '/upload',  
config: {  
payload: {
    maxBytes: 209715200,
    output: 'stream',
    parse: false
},
handler: function(request, reply) {
    var multiparty = require('multiparty');
    var form = new multiparty.Form();
    form.parse(request.payload, function(err, fields, files) {
        console.log(err);
        console.log(fields);
        console.log(files);

        return reply(util.inspect({fields: fields, files: files}));
    });
}}

猜你喜欢

转载自blog.csdn.net/wzy901213/article/details/79472153