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 相关文章推荐
js里的prototype使用示例
Nov 19 Javascript
jQuery.query.js 取参数的两点问题分析
Aug 06 Javascript
jQuery function的正确书写方法
Aug 02 Javascript
jquery重复提交请求的原因浅析
May 23 Javascript
JS使用正则表达式除去字符串中重复字符的方法
Nov 05 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
Jan 04 Javascript
JavaScript中split与join函数的进阶使用技巧
May 03 Javascript
JS中数组重排序方法
Nov 11 Javascript
谈谈Vue.js——vue-resource全攻略
Jan 16 Javascript
javascript实现日期三级联动下拉框选择菜单
Dec 03 Javascript
jquery无缝图片轮播组件封装
Nov 25 jQuery
基于layui table返回的值的多级嵌套的解决方法
Sep 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
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
PHP多线程类及用法实例
2014/12/03 PHP
Yii2隐藏frontend/web和backend/web的方法
2015/12/12 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
csdn 批量接受好友邀请
2009/02/19 Javascript
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
Ajax同步与异步传输的示例代码
2013/11/21 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
详解JS: reduce方法实现 webpack多文件入口
2017/02/14 Javascript
JavaScript中的一些隐式转换和总结(推荐)
2017/12/22 Javascript
记一次Vue.js混入mixin的使用(分权限管理页面)
2019/04/17 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
python tkinter实现界面切换的示例代码
2019/06/14 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
Pyspark获取并处理RDD数据代码实例
2020/03/27 Python
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
学生档案自我鉴定
2013/10/07 职场文书
数学系个人求职信范文
2014/01/30 职场文书
建筑工地门卫岗位职责
2014/04/30 职场文书
倡议书格式模板
2014/05/13 职场文书
小学优秀班集体申报材料
2014/05/25 职场文书
公司活动总结怎么写
2014/06/25 职场文书
群众路线教育实践活动的心得体会
2014/09/03 职场文书
政法干警核心价值观心得体会
2014/09/11 职场文书
2014年党风建设工作总结
2014/11/19 职场文书
挂职锻炼工作总结2015
2015/05/28 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
python for循环赋值问题
2021/06/03 Python
分享一些Java的常用工具
2021/06/11 Java/Android