Android Rxjava+Retrofit2上传图片以及多张图片
16lz
2021-01-23
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
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的文件操作 sdcard和rom
- android studio中断开SVN连接,并彻底清理项目中的.svn文件
- Android中显示gif动态图片
- 第二十篇 Android获取本机图片、音频、视频、文档以及本地文件夹
- Android中资源文件用法简单示例
- android关于图片缩放
- Unity3d导出Android的apk文件时相关问题的解决办法
- android编译系统的makefile文件Android.mk写法
- android文件系统挂载分析