Android中Okhttp3实现上传多张图片同时传递参数


Posted in Javascript onFebruary 18, 2017

之前上传图片都是直接将图片转化为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));导致后台无法用常规方法获取图片(虽然断点调试时也能看到图片数据),这点需要注意。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
vs2003 js文件编码问题的解决方法
Mar 20 Javascript
js本身的局限性 别让javascript做太多事
Mar 23 Javascript
火狐4、谷歌12不支持Jquery Validator的解决方法分享
Jun 20 Javascript
JS注释所产生的bug 即使注释也会执行
Nov 19 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
Feb 28 Javascript
JS实现网页表格自动变大缩小的方法
Mar 09 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
Oct 16 Javascript
使用vue.js开发时一些注意事项
Apr 27 Javascript
jQuery获取当前点击的对象元素(实现代码)
May 19 Javascript
jQuery插件Validation快速完成表单验证的方式
Jul 28 Javascript
jQuery事件详解
Feb 23 Javascript
Vuex简单入门
Apr 19 Javascript
AngularJS表单提交实例详解
Feb 18 #Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
Feb 18 #Javascript
JS实现数组去重复值的方法示例
Feb 18 #Javascript
bootstarp modal框居中显示的实现代码
Feb 18 #Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
Feb 18 #Javascript
JS表单数据验证的正则表达式(常用)
Feb 18 #Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
Feb 18 #Javascript
You might like
vBulletin Forum 2.3.xx SQL Injection
2006/10/09 PHP
给php新手谈谈我的学习心得
2007/02/25 PHP
PHP实现货币换算的方法
2014/11/29 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
JavaScript基于ajax编辑信息用法实例
2015/07/15 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
9种改善AngularJS性能的方法
2017/11/28 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
element-ui 设置菜单栏展开的方法
2018/08/22 Javascript
详解vue 数组和对象渲染问题
2018/09/21 Javascript
Vue通过WebSocket建立长连接的实现代码
2019/11/05 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
python备份文件的脚本
2008/08/11 Python
Django在Win7下的安装及创建项目hello word简明教程
2014/07/14 Python
Python中的MongoDB基本操作:连接、查询实例
2015/02/13 Python
Python使用add_subplot与subplot画子图操作示例
2018/06/01 Python
Python脚本完成post接口测试的实例
2018/12/17 Python
python实现自动解数独小程序
2019/01/21 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
Python GUI编程完整示例
2019/04/04 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
2020/03/08 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
python如何调用php文件中的函数详解
2020/12/29 Python
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
一套软件测试笔试题
2014/07/25 面试题
中专生毕业个人鉴定
2014/02/26 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
房产转让协议书
2014/04/11 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
高中运动会广播稿
2015/08/19 职场文书