国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Android中Okhttp3實現上傳多張圖片同時傳遞參數

2019-11-19 17:31:03
字體:
來源:轉載
供稿:網友

之前上傳圖片都是直接將圖片轉化為io流傳給服務器,沒有用框架傳圖片。

最近做項目,打算換個方法上傳圖片。

Android發展到現在,Okhttp顯得越來越重要,所以,這次我選擇用Okhttp上傳圖片。

Okhttp目前已經更新到Okhttp3版本了,用法跟之前相比,也有一些差別。在網上找了很多資料,

并和java后臺同事反復調試,終于成功上傳多張圖片,同時傳遞一些鍵值對參數。

以下是我對該過程的封裝:

private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");/**   * 上傳多張圖片及參數   * @param reqUrl URL地址   * @param params 參數   * @param pic_key 上傳圖片的關鍵字   * @param paths 圖片路徑   */  public Observable<String> sendMultipart(String reqUrl,Map<String, String> params,String pic_key, List<File> files){    return Observable.create(new Observable.OnSubscribe<String>(){      @Override      public void call(Subscriber<? super String> subscriber) {        MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder();        multipartBodyBuilder.setType(MultipartBody.FORM);        //遍歷map中所有參數到builder        if (params != null){          for (String key : params.keySet()) {            multipartBodyBuilder.addFormDataPart(key, params.get(key));          }        }        //遍歷paths中所有圖片絕對路徑到builder,并約定key如“upload”作為后臺接受多張圖片的key        if (files != null){          for (File file : files) {            multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file));          }        }        //構建請求體        RequestBody requestBody = multipartBodyBuilder.build();        Request.Builder RequestBuilder = new Request.Builder();        RequestBuilder.url(reqUrl);// 添加URL地址        RequestBuilder.post(requestBody);        Request request = RequestBuilder.build();        mOkHttpClient.newCall(request).enqueue(new Callback() {          @Override          public void onFailure(Call call, IOException e) {            subscriber.onError(e);            subscriber.onCompleted();            call.cancel();          }          @Override          public void onResponse(Call call, Response response) throws IOException {            String str = response.body().string();            subscriber.onNext(str);            subscriber.onCompleted();            call.cancel();          }        });      }    });  } 

在UI界面的調用:

OkHttp3Utils.getInstance().sendMultipart(Constants.URL.URL_ADD_NOTICE, mMap, "appendix", mImageList)        .observeOn(AndroidSchedulers.mainThread())        .subscribeOn(Schedulers.newThread())        .subscribe(new Subscriber<String>() {          @Override          public void onCompleted() {          }          @Override          public void onError(Throwable throwable) {            LogUtil.i(TAG, "throwable:" + throwable.toString());          }          @Override          public void onNext(String s) {                        LogUtil.i(TAG, "s:" + s);          }        }); 

調試過程中,有一次將 multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file));寫成了 multipartBodyBuilder.addFormDataPart(pic_key, null, RequestBody.create(MEDIA_TYPE_PNG, file));導致后臺無法用常規方法獲取圖片(雖然斷點調試時也能看到圖片數據),這點需要注意。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 筠连县| 伊吾县| 五大连池市| 仁布县| 乌鲁木齐县| 藁城市| 聂荣县| 张家界市| 泰兴市| 灵台县| 吕梁市| 长兴县| 岱山县| 绥化市| 临漳县| 云霄县| 探索| 通江县| 张家界市| 东乌珠穆沁旗| 岑溪市| 永清县| 北流市| 凤山市| 炉霍县| 酉阳| 清河县| 富蕴县| 呼伦贝尔市| 湟源县| 高陵县| 玉门市| 进贤县| 定兴县| 武鸣县| 金塔县| 察哈| 湾仔区| 神木县| 洪雅县| 察哈|