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 相关文章推荐
Javascript 不能释放内存.
Sep 07 Javascript
jquery each()源代码
Feb 14 Javascript
JavaScript返回网页中锚点数目的方法
Apr 03 Javascript
详解Matlab中 sort 函数用法
Mar 20 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
Aug 19 Javascript
老生常谈JavaScript 函数表达式
Sep 01 Javascript
微信小程序实现鼠标拖动效果示例
Dec 01 Javascript
vue嵌套路由与404重定向实现方法分析
May 04 Javascript
浅谈如何使用webpack构建多页面应用
May 30 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
Sep 05 jQuery
angularJs select绑定的model取不到值的解决方法
Oct 08 Javascript
Swiper.js实现移动端元素左右滑动
Sep 08 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
discuz7 phpMysql操作类
2009/06/21 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
PHP过滤★等特殊符号的正则
2014/01/27 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
javascript动态添加删除tabs标签的方法
2015/07/06 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
js实现文字跑马灯效果
2017/02/23 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
Python爬虫代理IP池实现方法
2017/01/05 Python
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
python Django的web开发实例(入门)
2019/07/31 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
python为什么会环境变量设置不成功
2020/06/23 Python
python爬虫用scrapy获取影片的实例分析
2020/11/23 Python
Python 无限级分类树状结构生成算法的实现
2021/01/21 Python
使用phonegap获取设备的一些信息方法
2017/03/31 HTML / CSS
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
技校教师求职简历的自我评价
2013/10/20 职场文书
司机检讨书
2014/02/13 职场文书
公司聘任书模板
2014/03/29 职场文书
趵突泉导游词
2015/02/03 职场文书
2015年党总支工作总结
2015/05/25 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
施工安全责任协议书
2016/03/23 职场文书
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python
详解Python中__new__方法的作用
2022/03/31 Python
win sever 2022如何占用操作主机角色
2022/06/25 Servers