Android中Okhttp3实现上传多张图片同时传递参数
2017-02-18 16:07
796 查看
之前上传图片都是直接将图片转化为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));导致后台无法用常规方法获取图片(虽然断点调试时也能看到图片数据),这点需要注意。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
相关文章推荐
- Okhttp3上传多张图片同时传递参数
- Android Retrofit 实现文字(参数)和多张图片一起上传
- android 使用OkHttp上传多张图片的实现代码
- Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传
- Android Retrofit 实现文字(参数)和多张图片一起上传
- Android okhttp带参数上传单张图片
- Servlet doPost方法同时上传图片和传递参数
- android调用系统分享实现朋友圈同时分享文字和图片(可多张)
- 微信小程序实现多张图片同时上传的方法
- android 使用OkHttp上传多张图片
- Android实现图片上传,可以选择多张图片,缩放预览,拍照上传等
- android 使用OkHttp上传多张图片
- Servlet doPost方法同时上传图片和传递参数
- Android OkHttp3 上传多张图片
- 实现android上传多张图片和文字给php后台
- android 使用OkHttp上传多张图片
- Android-客户端上传多张图片到服务器功能实现
- Android利用webservices实现图片远程上传
- struts2整合uploadify插件实现批量上传,上传成功后跳转并传递参数
- Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传