打造终极MVP+Retrofit2+okhttp3+Rxjava2网络请求,开发实用,简约,由于篇幅字数原因 本章讲解Retrofit文件上传
抓住人生中的一分一秒,胜过虚度中的一月一年!
前言
目前较火的网络请求其中有MVP+Retrofit2+okhttp3+Rxjava2,于是我也加入了使用行列,在网上找了许多案例,实际代码开发中解决了一些所谓的坑,总结了些内容与大家共享一下,有不足的地方希望大家提出我将进行再次完善。
实现目标
1、单图上传
2、多图上传
3、图片参数混合上传
先看下我自己封装的工具类,下边都会用到
/**
* File descripition: RetrofitUtil工具类
*
* @author lp
* @date 2018/8/13
*/
public class RetrofitUtil {
/**
* 将String 字符串转换为Rrtorfit: requestBody类型的value
*/
public static RequestBody convertToRequestBody(String param) {
RequestBody requestBody = null;
requestBody = RequestBody.create(MediaType.parse("text/plain"), param);
return requestBody;
}
/**
* 将所有的File图片集合转化为retorfit上传图片所需的: MultipartBody.Part类型的集合
*/
public static List<MultipartBody.Part> filesToMultipartBodyParts(List<File> files, String key) {
List<MultipartBody.Part> parts = new ArrayList<>(files.size());
for (File file : files) {
parts.add(filesToMultipartBodyParts(file, key));
}
return parts;
}
/**
* 将单个File图片转化为retorfit上传图片所需的: MultipartBody.Part类型
*/
public static MultipartBody.Part filesToMultipartBodyParts(File file, String key) {
RequestBody requestBody = RequestBody.create(MediaType.parse("image/png"), file);
MultipartBody.Part part = MultipartBody.Part.createFormData(key, file.getName(), requestBody);
return part;
}
public static List<File> initImages(List<String> mImages) {
List<File> listPicture = new ArrayList<>();
listPicture.clear();
Iterator<String> stuIter = mImages.iterator();
while (stuIter.hasNext()) {
String mUrl = stuIter.next();
listPicture.add(new File(mUrl));
}
return listPicture;
}
}
1、单图上传
1.第一种方法
首先创建接口,注意注解需要用@Multipart 参数形式@Part MultipartBody.Part parts
@Multipart
@POST("api/Company/register")
Observable<BaseModel<Object>> upLoadImg(@Part MultipartBody.Part parts);
public interface UpLoadView extends BaseView {
void onUpLoadImgSuccess(BaseModel<Object> o);
}
public class UpLoadPresenter extends BasePresenter<UpLoadView> {
public UpLoadPresenter(UpLoadView baseView) {
super(baseView);
}
public void upLoadImgApi(MultipartBody.Part parts) {
addDisposable(apiServer.upLoadImg(parts), new BaseObserver(baseView) {
@Override
public void onSuccess(Object o) {
baseView.onUpLoadImgSuccess((BaseModel<Object>) o);
}
@Override
public void onError(String msg) {
if (baseView != null) {
baseView.showError(msg);
}
}
});
}
}
@Override
public void onClick(View v) {
/**
* 俩个参数 一个是图片路径 一个是和后台约定的Key,如果后台不需要,随便写都行
*/
mPresenter.upLoadImgApi(RetrofitUtil.filesToMultipartBodyParts(new File("tupian.lujing"), "tupian.key"));
}
2.第二种方法
首先创建接口,注意注解需要用@Multipart 参数形式List<MultipartBody.Part> parts
问:为啥用List? 答:List只有一张图片不就是单张了 可以冷笑一下不介意
@Multipart
@POST("api/user_info/update_headimg")
Observable<BaseModel<Object>> upHeadImg(@Part List<MultipartBody.Part> parts);
public interface UpLoadView extends BaseView {
void onUpHeadImgSuccess(BaseModel<Object> o);
}
public class UpLoadPresenter extends BasePresenter<UpLoadView> {
public UpLoadPresenter(UpLoadView baseView) {
super(baseView);
}
public void upHeadImgApi(List<MultipartBody.Part> parts) {
addDisposable(apiServer.upHeadImg(parts), new BaseObserver(baseView) {
@Override
public void onSuccess(Object o) {
baseView.onUpHeadImgSuccess((BaseModel<Object>) o);
}
@Override
public void onError(String msg) {
if (baseView != null) {
baseView.showError(msg);
}
}
});
}
}
@Override
public void onClick(View v) {
/**
* 俩个参数 一个是图片集合路径 一个是和后台约定的Key,如果后台不需要,随便写都行
*/
List<String> strings=new ArrayList<>();
for (int i=0;i<1;i++){
strings.add("tupian.lujing");
}
mPresenter.upHeadImgApi(RetrofitUtil.filesToMultipartBodyParts(RetrofitUtil.initImages(strings), "tupian.key"));
}
1、多图上传
和单图上传第二种方法一样
@Multipart
@POST("api/user_info/update_headimg")
Observable<BaseModel<Object>> upHeadImg(@Part List<MultipartBody.Part> parts);
public interface UpLoadView extends BaseView {
void onUpHeadImgSuccess(BaseModel<Object> o);
}
public class UpLoadPresenter extends BasePresenter<UpLoadView> {
public UpLoadPresenter(UpLoadView baseView) {
super(baseView);
}
public void upHeadImgApi(List<MultipartBody.Part> parts) {
addDisposable(apiServer.upHeadImg(parts), new BaseObserver(baseView) {
@Override
public void onSuccess(Object o) {
baseView.onUpHeadImgSuccess((BaseModel<Object>) o);
}
@Override
public void onError(String msg) {
if (baseView != null) {
baseView.showError(msg);
}
}
});
}
}
@Override
public void onClick(View v) {
/**
* 俩个参数 一个是图片集合路径 一个是和后台约定的Key,如果后台不需要,随便写都行
*/
List<String> strings=new ArrayList<>();
for (int i=0;i<100;i++){
strings.add("tupian.lujing");
}
mPresenter.upHeadImgApi(RetrofitUtil.filesToMultipartBodyParts(RetrofitUtil.initImages(strings), "tupian.key"));
}
3、图片参数混合上传
首先创建接口,注意注解需要用@Multipart 参数形式
@PartMap Map<String, RequestBody> map,
@Part List<MultipartBody.Part> parts
注:Map中可以用String也可以用RequestBody
@Multipart
@POST("api/Express/add")
Observable<BaseModel<Object>> expressAdd(@PartMap Map<String, RequestBody> map,
@Part List<MultipartBody.Part> parts);
public interface UpLoadView extends BaseView {
void onExpressAddSuccess(BaseModel<Object> o);
}
public class UpLoadPresenter extends BasePresenter<UpLoadView> {
public UpLoadPresenter(UpLoadView baseView) {
super(baseView);
}
public void expressAdd(String title, String content, List<MultipartBody.Part> parts) {
HashMap<String, RequestBody> params = new HashMap<>();
params.put("title", RetrofitUtil.convertToRequestBody(title));
params.put("content", RetrofitUtil.convertToRequestBody(content));
addDisposable(apiServer.expressAdd(params, parts), new BaseObserver(baseView) {
@Override
public void onSuccess(Object o) {
baseView.onExpressAddSuccess((BaseModel<Object>) o);
}
@Override
public void onError(String msg) {
if (baseView != null) {
baseView.showError(msg);
}
}
});
}
}
@Override
public void onClick(View v) {
/**
* 俩个参数 一个是图片集合路径 一个是和后台约定的Key,如果后台不需要,随便写都行
*/
List<String> strings = new ArrayList<>();
for (int i = 0; i < 10; i++) {
strings.add("tupian.lujing");
}
mPresenter.expressAdd(
"title",
"content",
RetrofitUtil.filesToMultipartBodyParts(RetrofitUtil.initImages(strings), "tupian.key"));
}
这样看起来会简洁明了,MVP框架连接 传送
能帮助到大家的点个赞支持一下,谢谢
网友评论