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常见表单应用技巧
Jan 09 Javascript
Cookie 注入是怎样产生的
Apr 08 Javascript
JavaScript省市联动实现代码
Feb 15 Javascript
JS实现的加减乘除四则运算计算器示例
Aug 09 Javascript
JS中关于正则的巧妙操作
Aug 31 Javascript
微信小程序自定义组件实现tabs选项卡功能
Jul 14 Javascript
详解使用mpvue开发github小程序总结
Jul 25 Javascript
Vue触发隐藏input file的方法实例详解
Aug 14 Javascript
如何在Vue中抽离接口配置文件
Oct 31 Javascript
基于vue-cli3和element实现登陆页面
Nov 13 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
Jan 16 Javascript
Vue+Vant 图片上传加显示的案例
Nov 03 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
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
IScroll5 中文API参数说明和调用方法
2016/05/21 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
js中string和number类型互转换技巧(分享)
2016/11/28 Javascript
几种tab切换详解
2017/02/03 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
Django入门使用示例
2017/12/12 Python
获取python文件扩展名和文件名方法
2018/02/02 Python
Python中常见的异常总结
2018/02/20 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
python开发游戏的前期准备
2019/05/05 Python
python挖矿算力测试程序详解
2019/07/03 Python
在python中画正态分布图像的实例
2019/07/08 Python
Python 操作 ElasticSearch的完整代码
2019/08/04 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
保洁主管岗位职责
2013/11/20 职场文书
校运会入场式解说词
2014/02/10 职场文书
数控技术学生的自我评价
2014/02/15 职场文书
保护环境倡议书300字
2014/05/19 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
电话客服工作职责
2014/07/27 职场文书
全国优秀教师事迹材料
2014/08/26 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
法定授权委托证明书
2015/06/18 职场文书
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
2022/04/08 Java/Android