Android Rxjava+Retrofit2上传图片以及多张图片

Android图片上传有两种方式:

一种是文件流的方式上传,图片转换成二进制上传;

另一种是把图片转成Base64方式上传.

现在我们来说一下文件流上传图片、(图片上传需要一个图片的路径,同时调用本地相册或者拍照可以返回的图片路径)

添加Rxjava+Retrofit2的依赖

    //Rxjava+Retrofit
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'io.reactivex.rxjava2:rxjava:2.1.7'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'//gson 解析器

首先创建接口

public interface  ApiService {
    @Multipart
    @POST("index.php/Home/Service/Complain")
    Observable uploadImages(@PartMap() Map map);
}

ImageOKteep是你的数据请求下来的javaBean,根据接口文档写下来。

接下来就是上传图片的请求:简单明了

 private void uploadImage2(File file) {

        Map map = new HashMap<>();

        //"image/png" 是内容类型,后台设置的类型

        RequestBody requestBody = RequestBody.create(MediaType.parse("image/png"), file);

         /*
          * 这里重点注意:
          * com_img[]里面的值为服务器端需要key   只有这个key 才可以得到对应的文件
          * filename是文件的名字,包含后缀名的   比如:abc.png
          */

        map.put("com_img[]\"; filename=\"" + file.getName(), requestBody);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Event.url)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        ApiService apiService = retrofit.create(ApiService.class);

        Observable meSetIconObservable = apiService.uploadImages(map);

        meSetIconObservable.subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {

                    }

                    @Override
                    public void onNext(@NonNull ImageOKteep imageOKteep) {

                    }

                    @Override
                    public void onError(@NonNull Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

如果是多张图片

List compressFile是你存放图片文件的集合。

 private void uploadImage2(List compressFile) {

        //多张图片
        Map map = new HashMap<>();

        if (compressFile != null && !compressFile.isEmpty()) {

        for (int i = 0; i < compressFile.size(); i++) {

            File file = compressFile.get(i);

            RequestBody requestBody = RequestBody.create(MediaType.parse("image/png"), file);

            map.put("com_img[]\"; filename=\"" + file.getName(), requestBody);

        }
    }

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Event.url)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        ApiService apiService = retrofit.create(ApiService.class);

        Observable meSetIconObservable = apiService.uploadImages(map);

        meSetIconObservable.subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {

                    }

                    @Override
                    public void onNext(@NonNull ImageOKteep imageOKteep) {

                    }

                    @Override
                    public void onError(@NonNull Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

这样就可以上传多图了。

可以结合这位大佬的写的进行参考:https://blog.csdn.net/u010872619/article/details/78860486

你可能感兴趣的:(Android)