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<ImageOKteep> uploadImages(@PartMap() Map<String, RequestBody> map);
}
ImageOKteep是你的数据请求下来的javaBean,根据接口文档写下来。
接下来就是上传图片的请求:简单明了
private void uploadImage2(File file) {
Map<String, RequestBody> 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<ImageOKteep> meSetIconObservable = apiService.uploadImages(map);
meSetIconObservable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ImageOKteep>() {
@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<File> compressFile是你存放图片文件的集合。
private void uploadImage2(List<File> compressFile) {
//多张图片
Map<String, RequestBody> 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<ImageOKteep> meSetIconObservable = apiService.uploadImages(map);
meSetIconObservable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ImageOKteep>() {
@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.youkuaiyun.com/u010872619/article/details/78860486