1. 程式人生 > >rxjava2 + retrofit上傳檔案示例

rxjava2 + retrofit上傳檔案示例

service請求引數:


ApiService:

@Multipart
@POST("/api/chunkupload/upload")
Observable<Response<UploadFileModel>> fileUpload(@Part(value = "key") String key, @Part() MultipartBody.Part file);

請求過程:


核心部分

RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"
), file); MultipartBody.Part body = MultipartBody.Part.createFormData("attach_file", file.getName(), requestFile);

全部程式碼:


final String mp4Path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/video.mp4";
final long fileSize = new File(mp4Path).length();
RetrofitHelper
.create().applyUpload("video.mp4", (int) fileSize) .filter(new Predicate<Response<UploadApplyModel>>() { @Override public boolean test(Response<UploadApplyModel> response) throws Exception { return response.getCode() == 200; }
}) .flatMap(new Function<Response<UploadApplyModel>, Observable<File>>() { @Override public Observable<File> apply(Response<UploadApplyModel> response) throws Exception { UploadApplyModel model = response.getData(); int chunkSize = model.getChunk_size(); String filePath = Environment.getExternalStorageDirectory().getAbsolutePath()+ "/video" + ".mp4"; List<File> list = new ArrayList<>(); key = model.getKey(); //切割檔案 splitFile(filePath, chunkSize, list); return Observable.fromIterable(list); } }) .flatMap(new Function<File, Observable<Response<UploadFileModel>>>() { @Override public Observable<Response<UploadFileModel>> apply(File file) throws Exception { RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); MultipartBody.Part body = MultipartBody.Part.createFormData("attach_file", file.getName(), requestFile); Log.e("uploadFile", "key:" + key); return RetrofitHelper.create().fileUpload(key, body); } }).compose(RxTransformer.<UploadFileModel>handleResult(this)) .subscribe(new Consumer<UploadFileModel>() { @Override public void accept(UploadFileModel uploadFileModel) throws Exception { Log.e("uploadFile", uploadFileModel.getProgress() + ""); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { if(throwable instanceof RetrofitException){ Log.e("uploadFile", ((RetrofitException)throwable).getErrorMsg()); } } });

上面的程式碼有缺陷!!!!!!!

上傳的引數 key,伺服器接受到的值會帶有引號,所以需要修改如下:

@POST("/api/chunkupload/upload")
Observable<Response<UploadFileModel>> fileUpload(@Body RequestBody params);

MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
builder.addFormDataPart("key", key);
builder.addFormDataPart("attach_file",  file.getName(),
        RequestBody.create(MediaType.parse("multipart/octet-stream"), file));
return RetrofitHelper.create().fileUpload(builder.build());