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 表格排序和表头浮动效果(扩展SortTable)
Apr 07 Javascript
Javascript图像处理—平滑处理实现原理
Dec 28 Javascript
Js中的onblur和onfocus事件应用介绍
Aug 27 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
Dec 05 Javascript
让html页面不缓存js的实现方法
Oct 31 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
Aug 19 Javascript
基于jQuery实现放大镜特效
Oct 19 Javascript
jquery拖拽排序简单实现方法(效果增强版)
Feb 16 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
Mar 13 Javascript
微信、QQ、微博、Safari中使用js唤起App
Jan 24 Javascript
vue数组对象排序的实现代码
Jun 20 Javascript
React实现轮播效果
Aug 25 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
剧场版动画《PSYCHO-PASS 3 FIRST INSPECTOR》3月27日日本上映!
2020/03/06 日漫
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
JS.elementGetStyle(element, style)应用示例
2013/09/24 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
js读写json文件实例代码
2014/10/21 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
基于MVC方式实现三级联动(JavaScript)
2017/01/23 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
2017/02/12 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
JS库之ParticlesJS使用简介
2017/09/12 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
2018/06/04 Javascript
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
python获取糗百图片代码实例
2013/12/18 Python
python 转换 Javascript %u 字符串为python unicode的代码
2016/09/06 Python
Python使用pymongo模块操作MongoDB的方法示例
2018/07/20 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
2018/08/05 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
pytorch数据预处理错误的解决
2020/02/20 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
Python gevent协程切换实现详解
2020/09/14 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
美国在线宠物商店:Chewy
2019/01/12 全球购物
工厂实习感言
2014/01/14 职场文书
自行车租赁公司创业计划书
2014/01/28 职场文书
国庆节文艺活动方案
2014/02/03 职场文书
《逃家小兔》教学反思
2014/02/23 职场文书
中式婚礼主持词
2014/03/13 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
承诺书样本
2014/08/30 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
横空出世观后感
2015/06/09 职场文书