Retrofit2之文件上傳和文件下載

 1.文件上傳

 /**
     * @param taskId
     * @param file
     * @return 上傳文件
     */
    @Multipart
    @PUT("api/censor/uploadVideo")
    Observable<Result> uploadFile(
            @Part("taskId") long taskId,
            @Part("liveId") long liveId,
            @Part MultipartBody.Part file);

  @MultiPart:允許包含多個@Part

  @PUT:PUT請求 + 請求地址

  @Part:上傳參數,也可以用作MultipartBody用來指定文件,相當於使用OKhttp的MultipartBody.Part類

從源碼中我們可以看出MultipartBody是繼承於RequestBody的,相當於封裝了一層

配置好了之後可以開始進行請求了,請求是Retrofit+rxjava結合,Retrofit負責發送請求,rxjava負責響應和處理

RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
        MultipartBody.Part body = MultipartBody.Part.createFormData("fileName", file.getName(), requestFile);
        RetrofitHttp.getResponse().uploadFile(jsonDevicesResult.getData().getId(), jsonXml.getLiveId(), body)
                .compose(RetrofitHttp.ThreadDispatch())
                .subscribe(new Subscriber<Result>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i(TAG, "文件上傳失敗:" + e.toString());
                    }

                    @Override
                    public void onNext(Result result) {
                        Log.i(TAG, "文件上傳消息: " + result.toString());
                    }
                });

首先是創建了RequestBody的create()方法創建了一個文件上傳的請求體,將請求體添加到MultipartBody.Part中,通過調用上傳就完成了

2.文件下載

 

 /**
     * @param url 服務器端約定的上傳路徑
     * @return
     */
    @Streaming
    @GET
    Observable<ResponseBody> download(@Url String url);

@Streaming:配置註解文件上傳

@GET:備註了@Streaming,GET不用攜帶參數哦

@Url:和服務器端約定的上傳地址

 RetrofitHttp.getResponse().download(url) //開始下載
                .compose(RetrofitHttp.ThreadDispatch()) //下載在子線程,下載後轉主線程
                .map(ResponseBody::byteStream) //將responseBody轉成byteStream
                .observeOn(rx.schedulers.Schedulers.computation()) //事件循環
                .concatMap((Func1<InputStream, rx.Observable<Long>>) inputStream -> {
                    //將轉化出來的流寫入文件中
                    FileUtils.writeFile(inputStream, Config.FileAssets.OUTSIDE);
                    return rx.Observable.timer(10, TimeUnit.SECONDS);
                })
                //轉到主線程
                .observeOn(rx.android.schedulers.AndroidSchedulers.mainThread())
                //結束,獲取寫入結果
                .subscribe(new Subscriber<Long>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i(TAG, "下載失敗 , 失敗原因:" + e.toString());
                    }

                    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
                    @Override
                    public void onNext(Long aLong) {
                        Log.i(TAG, "下載成功");
                    }
                });

上面的註釋已經非常詳細了,使用Retrofit上傳和下載就是這麼簡單,雖然retrofit底層也是封裝了OKhttp,但是封裝之後使邏輯更加清楚,請求體和請求過程分離,使用註解的方式,直接通過註解就能配置各種請求,因爲基於OKhttp,所以也能處理幾乎所有請求,一般使用retrofit會和rxjava和OKhttp組成retrofit&rxjava&OKhttp,OKhttp負責各種配置,如請求頭、攔截器、日誌、響應時間等等,retrofit負責邏輯清晰,使代碼更加簡單易懂,rxjava負責請求之後的處理,基於觀察者模式的響應式處理使複雜的業務邏輯在一條鏈上完成,不需要多層嵌套!

發佈了20 篇原創文章 · 獲贊 12 · 訪問量 5560
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章