最近搞个功能,文件和别的参数一起上传,本人比较渣,之前做的是把String参数拼在Url后面一起传给后台,
===============================新==============================
/** * 修改个人信息 */ @Multipart @POST(Configs.Url.MODIFY_PERSONAL) Observable<BaseHttpResult> modifyPersonal(@PartMap Map<String, RequestBody> map, @Part MultipartBody.Part body);
MultipartBody.Part part = null; if (file != null) { RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); part = MultipartBody.Part.createFormData("image", file.getName(), imageBody); } else { part = MultipartBody.Part.createFormData("", "");//如果图片不是必须上传的==== } Map<String, RequestBody> map = new HashMap<>(); map.put("nickname", RequestBody.create(MediaType.parse("text/plain"), etNickname.getText().toString().trim())); RetrofitManager.getInstance().getApi().modifyPersonal(map, part) .subscribeOn(Schedulers.newThread()) .compose(ScheduleTransformer.<BaseHttpResult>switchSchedulers()) .subscribe(new BaseObserver() { @Override public void onSuccess(BaseHttpResult result) { hideProgressDialog(); showToast(result.getMsg()); EventBus.getDefault().post(new EventCenter(Configs.REFRESH_DATA)); finish(); } @Override public void onErrorMessage(String msg) { hideProgressDialog(); showToast(msg); } });
===============================新==============================
//上传轮播图---单张上传
@Multipart
@POST()
Observable<ResultMsgModel> uploadBannerImage(@Url String url, @Part MultipartBody.Part body);
Observable.just(file)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(new Function<List<File>, ObservableSource<File>>() {
@Override
public ObservableSource<File> apply(@io.reactivex.annotations.NonNull List<File> file1) throws Exception {
return Observable.fromIterable(file1);
}
})
.concatMap(new Function<File, ObservableSource<ResultMsgModel>>() {
@Override
public ObservableSource<ResultMsgModel> apply(@io.reactivex.annotations.NonNull File file) throws Exception {
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part parts = MultipartBody.Part.createFormData("car", file.getName(), requestFile);
return Retrofit2Manager.getObservable(Retrofit2Manager.getService().uploadBannerImage(Configs.Url.SaveCarou
+ "?id=" + "&storeId=" + SharePreferenceUtil.getStoreId() + "&status=" + isShow
+ "&caUrl=" + url + "&sort=", parts));
}
})
.map(new Function<ResultMsgModel, String>() {
@Override
public String apply(@io.reactivex.annotations.NonNull ResultMsgModel resultMsgModel) throws Exception {
return resultMsgModel.getMsg();
}
})
.subscribe(new Consumer<String>() {
@Override
public void accept(@io.reactivex.annotations.NonNull String string) throws Exception {
dismissDialog();
if (string.equalsIgnoreCase("success")) {
ToastUtil.show(StoreActivity.this, "上传图片成功!");
finish();
} else {
ToastUtil.show(StoreActivity.this, "上传图片失败,请重试!");
}
}
}, new BaseThrowConsumer(this) {
@Override
protected void accepted(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception {
fail("上传图片失败");
dismissDialog();
}
});
之前是这样上传的,但是总感觉上传的Url不是很好看,其实百度一下网上有好多的,一直没看懂,感觉下面的用起来优雅一点
//修改个人信息
@POST(Configs.Url.editPersonal)
Observable<ModifyPersonalModel> modifyInfo(@Body RequestBody Body);
File header = new File(path);
//构建body
RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("mobile", etTel.getText().toString())
.addFormDataPart("trueName", etName.getText().toString())
.addFormDataPart("sex", String.valueOf(sexId))
.addFormDataPart("user_id", String.valueOf(SharePreferenceUtil.getUserId()))
.addFormDataPart("hea", header.getName(), RequestBody.create(MediaType.parse("image/*"), header))
.build();
mDisposable = Retrofit2Manager.getObservable(Retrofit2Manager.getService().modifyInfo(requestBody))
这里只是记录下,太渣,总忘