Android中Okhttp3實(shí)現(xiàn)上傳多張圖片同時(shí)傳遞參數(shù)
之前上傳圖片都是直接將圖片轉(zhuǎn)化為io流傳給服務(wù)器,沒有用框架傳圖片。
最近做項(xiàng)目,打算換個(gè)方法上傳圖片。
Android發(fā)展到現(xiàn)在,Okhttp顯得越來越重要,所以,這次我選擇用Okhttp上傳圖片。
Okhttp目前已經(jīng)更新到Okhttp3版本了,用法跟之前相比,也有一些差別。在網(wǎng)上找了很多資料,
并和java后臺(tái)同事反復(fù)調(diào)試,終于成功上傳多張圖片,同時(shí)傳遞一些鍵值對(duì)參數(shù)。
以下是我對(duì)該過程的封裝:
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); /** * 上傳多張圖片及參數(shù) * @param reqUrl URL地址 * @param params 參數(shù) * @param pic_key 上傳圖片的關(guān)鍵字 * @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中所有參數(shù)到builder if (params != null){ for (String key : params.keySet()) { multipartBodyBuilder.addFormDataPart(key, params.get(key)); } } //遍歷paths中所有圖片絕對(duì)路徑到builder,并約定key如“upload”作為后臺(tái)接受多張圖片的key if (files != null){ for (File file : files) { multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file)); } } //構(gòu)建請(qǐng)求體 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界面的調(diào)用:
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); } });
調(diào)試過程中,有一次將 multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file));寫成了 multipartBodyBuilder.addFormDataPart(pic_key, null, RequestBody.create(MEDIA_TYPE_PNG, file));導(dǎo)致后臺(tái)無法用常規(guī)方法獲取圖片(雖然斷點(diǎn)調(diào)試時(shí)也能看到圖片數(shù)據(jù)),這點(diǎn)需要注意。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
腳本吧 - 幻宇工作室用到j(luò)s,超強(qiáng)推薦expand.js
腳本吧 - 幻宇工作室用到j(luò)s,超強(qiáng)推薦expand.js...2006-12-12JavaScript中使用sencha gridpanel 編輯單元格、改變單元格顏色
ExtJS中的表格功能非常強(qiáng)大,包括了排序、緩存、拖動(dòng)、隱藏某一列、自動(dòng)顯示行號(hào)、列匯總、單元格編輯等實(shí)用功能,通過本篇文章給大家介紹JavaScript中使用sencha gridpanel 編輯單元、改變單元格顏色,感興趣的朋友一起學(xué)習(xí)2015-11-11typescript編寫微信小程序創(chuàng)建項(xiàng)目的方法
這篇文章主要介紹了typescript編寫微信小程序創(chuàng)建項(xiàng)目的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01基于JS實(shí)現(xiàn)蜘蛛俠動(dòng)作游戲的示例代碼
這篇文章主要介紹了如何利用JavaScript實(shí)現(xiàn)簡(jiǎn)單的蜘蛛俠動(dòng)作游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)JavaScript游戲開發(fā)有一定的幫助,需要的可以參考一下2022-06-06js刪除對(duì)象/數(shù)組中null、undefined、空對(duì)象及空數(shù)組方法示例
這篇文章主要給大家介紹了關(guān)于js刪除對(duì)象/數(shù)組中null、undefined、空對(duì)象及空數(shù)組的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編一起來看看吧2018-11-11js獲取html頁面代碼中圖片地址的實(shí)現(xiàn)代碼
這篇文章主要介紹了js獲取html代碼中圖片地址的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-03-03js實(shí)現(xiàn)表格拖動(dòng)選項(xiàng)
這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)表格拖動(dòng)選項(xiàng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04