okhttp上传图片和其他参数_Android中Okhttp3实现上传多张图片同时传递参数_放手_前端开发者...
之前上傳圖片都是直接將圖片轉(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 sendMultipart(String reqUrl,Map params,String pic_key, List files){
return Observable.create(new Observable.OnSubscribe(){
@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() {
@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í)有所幫助,也希望大家多多支持前端開發(fā)者。
總結(jié)
以上是生活随笔為你收集整理的okhttp上传图片和其他参数_Android中Okhttp3实现上传多张图片同时传递参数_放手_前端开发者...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 事务_从Oracle到PG
- 下一篇: Android怎么自定义listview