最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Android中Okhttp3实现上传多张图片同时传递参数
时间:2017-04-17 编辑:简简单单 来源:一聚教程网
之前上传图片都是直接将图片转化为io流传给服务器,没有用框架传图片。
最近做项目,打算换个方法上传图片。
Android发展到现在,Okhttp显得越来越重要,所以,这次我选择用Okhttp上传图片。
Okhttp目前已经更新到Okhttp3版本了,用法跟之前相比,也有一些差别。在网上找了很多资料,
并和java后台同事反复调试,终于成功上传多张图片,同时传递一些键值对参数。
以下是我对该过程的封装:
代码如下 | 复制代码 |
privatestaticfinalMediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
/** * 上传多张图片及参数 * @param reqUrl URL地址 * @param params 参数 * @param pic_key 上传图片的关键字 * @param paths 图片路径 */ publicObservable returnObservable.create(newObservable.OnSubscribe
@Override publicvoidcall(Subscriber subscriber) { MultipartBody.Builder multipartBodyBuilder =newMultipartBody.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 =newRequest.Builder(); RequestBuilder.url(reqUrl);// 添加URL地址 RequestBuilder.post(requestBody); Request request = RequestBuilder.build(); mOkHttpClient.newCall(request).enqueue(newCallback() { @Override publicvoidonFailure(Call call, IOException e) { subscriber.onError(e); subscriber.onCompleted(); call.cancel(); }
@Override publicvoidonResponse(Call call, Response response)throwsIOException { 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(newSubscriber @Override publicvoidonCompleted() {
}
@Override publicvoidonError(Throwable throwable) { LogUtil.i(TAG,"throwable:"+ throwable.toString()); }
@Override publicvoidonNext(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));导致后台无法用常规方法获取图片(虽然断点调试时也能看到图片数据),这点需要注意。
相关文章
- sora软件价格介绍 02-22
- sora官网入口地址一览 02-22
- Sora生成的视频使用教程 02-22
- 《梦幻西游》元宵灯谜线索答案大全2024 02-22
- 《原神》有朋自远方来第一天通关攻略 02-22
- 《苏醒之路》四个结局达成攻略 02-22