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两段代码,两个小技巧
Feb 04 Javascript
javascript学习笔记(八) js内置对象
Jun 19 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
Jan 26 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
Jul 28 Javascript
JS三目运算(三元运算)方法详解
Mar 01 Javascript
JavaScript基础之this详解
Jun 04 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
Sep 12 Javascript
vue 挂载路由到头部导航的方法
Nov 13 Javascript
玩转vue的slot内容分发
Sep 22 Javascript
JS桶排序的简单理解与实现方法示例
Nov 25 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
Aug 27 Javascript
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
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
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
PHP 作用域解析运算符(::)
2010/07/27 PHP
PHP无限分类(树形类)的深入分析
2013/06/02 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
php mysql_real_escape_string函数用法与实例教程
2013/09/30 PHP
20个非常棒的Jquery实用工具 国外文章
2010/01/01 Javascript
动态载入/删除/更新外部 JavaScript/Css 文件的代码
2010/07/03 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
jQuery实现预加载图片的方法
2015/03/17 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
python实现删除文件与目录的方法
2014/11/10 Python
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
python由已知数组快速生成新数组的方法
2020/04/08 Python
python爬取微博评论的实例讲解
2021/01/15 Python
美国温暖商店:The Warming Store
2018/12/15 全球购物
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
环境工程大学生个人的自我评价
2013/10/08 职场文书
数控技术专业推荐信
2013/11/01 职场文书
银行实习生的自我评价
2013/12/09 职场文书
中学教师培训制度
2014/01/31 职场文书
股票投资建议书
2014/05/19 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
信用卡工资证明范本
2014/10/17 职场文书
工作收入住址证明
2014/10/28 职场文书
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis
使用Redis做预定库存缓存功能
2022/04/02 Redis