Retiofit配合RxJava单文件上传

一.通过接口定义上传

定义的接口方法,需要注意的是,这个方法不再有 @FormUrlEncoded 这个注解,而换成了 @Multipart,后面只需要在参数中增加 Part 就可以了。也许你会问,这里的 Part 和 Field 究竟有什么区别,其实从功能上讲,无非就是客户端向服务端发起请求携带参数的方式不同,并且前者可以携带的参数类型更加丰富,包括数据流。也正是因为这一点,我们可以通过这种方式来上传文件:

@Part("file\"; filename=\"avatar.jpg") RequestBody file

file为字段名(唯一,根据文档更改)    filename为文件名(随便定义)


public interface RetiofitVpi {
    //上传文件
    @Multipart
    @POST("file/upload")
    Observable uploadFile(@Query("uid") String uid,
                                    @Part("file\"; filename=\"avatar.jpg") RequestBody file);
}

二   下面我们就给出这个接口的使用方法:

参数:file为文件

“3381”为文档一个参数(根据接口文档更改)

public void uploadFiles(File file){
        //代理模式生成对应server的实例化对象
        RetiofitVpi server = RetiofitUtils.getInstance().create(RetiofitVpi.class);
        //创建RequwstBody对象
        RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);
        //使用RxJava方式调度任务并监听
        server.uploadFile("3381",requestBody)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer() {
                    @Override
                    public void accept(FileBean nicknameBean) throws Exception {
                        if (nicknameBean!=null){
                            Log.e("MainActivity",nicknameBean.getMsg());
                        }else {
                            Log.e("MainActivity","**********");
                        }

                    }
                }, new Consumer() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Log.e("MainActivity",throwable.toString());
                    }
                });
    }


你可能感兴趣的:(android)