我在寫圖片選擇時用戶要求可以多張選擇,可是之前的圖片工具類只能單張選擇,恰好在github上找到了rxgalleryfinal這個庫,就想拿來用一下,沒想到studio一直報重復導入的問題,查詢半天發(fā)現(xiàn)了問題所在:rxgalleryfinal內(nèi)部用的是retrofit2+rxjava2的網(wǎng)絡框架,而項目用的還是一直沿用之前的retrofit+rxjava的舊框架,rxjava和rxjava2無法共存所以報錯,在將框架全部更新后發(fā)現(xiàn)之前上傳圖片時添加的參數(shù)出現(xiàn)了問題.
后臺接口要求的是修改頭像時要傳一個token,而普通上傳比如發(fā)布動態(tài)時不傳即可,所有的上傳圖片通用這一個接口
之前因為是rxjava1所以用的都是observable,換成rxjava后使用可以解決背壓問題的flowable,retrofit注解只能使用一個,用了@multipart注解后就不能再添加表單注解,所以查了下網(wǎng)上給出的方法是講@Field替換為@Part,如下代碼
這是retrofit實現(xiàn)類中的接口:
@POST("user/upload")
@Multipart
Flowable<BaseResponse<List<String>>> upload(@Part("token") String token,
@Part MultipartBody.Part part);
接口實現(xiàn)類中的方法
@Override
public Flowable<BaseResponse<List<String>>> upload(String token, String path) {
File file = new File(path);
RequestBody photoRequestBody = RequestBody.create(MediaType.parse("image/jpg"), file);
MultipartBody.Part photoPart = MultipartBody.Part.createFormData("file", file.getName(), photoRequestBody);
return api.upload(token, photoPart);
}
這種方法傳token是錯誤的,應該在上傳圖片時將token封到
MultipartBody.Builder
如下代碼,或者將上面的@Part("token) String token改為 @Part("token) RequestBody token即可
代碼中將token添加到requestbody中
RequestBody tokenBody = RequestBody.create(MediaType.parse("text/plain"), token);
以下代碼適用多張圖片上傳,循環(huán)添加到builder中即可
@POST("user/upload")
@Multipart
Flowable<BaseResponse<List<String>>> upload(@Part List<MultipartBody.Part> parts);
@Override
public Flowable<BaseResponse<List<String>>> upload(String token, String path) {
File file = new File(path);
MultipartBody.Builder builder = new MultipartBody.Builder()
.setType(MultipartBody.FORM)//表單類型
.addFormDataPart("token", token);
RequestBody photoRequestBody = RequestBody.create(MediaType.parse("image/jpg"), file);
builder.addFormDataPart("file", file.getName(), photoRequestBody);
List<MultipartBody.Part> parts = builder.build().parts();
return api.upload(parts);
}
單張圖片上傳傳參時去掉List,如果加參數(shù)則添加到requestbody中再上傳
參考文章:http://blog.csdn.net/itjianghuxiaoxiong/article/details/52135748