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 相关文章推荐
Prototype1.5 rc2版指南最后一篇之Position
Jan 10 Javascript
function foo的原型与prototype属性解惑
Nov 19 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
Jan 03 Javascript
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
Feb 05 Javascript
Jquery实现视频播放页面的关灯开灯效果
May 27 Javascript
页面按钮禁用与解除禁用的方法
Feb 19 Javascript
浅谈javascript中for in 和 for each in的区别
Apr 23 Javascript
javascript控制层显示或隐藏的方法
Jul 22 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
Aug 11 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
Sep 23 Javascript
vue 开发企业微信整合案例分析
Dec 02 Javascript
javascript实现智能手环时间显示
Sep 18 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
一个图形显示IP的PHP程序代码
2007/10/19 PHP
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
2010/02/08 PHP
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
IE 条件注释详解总结(附实例代码)
2009/08/29 Javascript
js 中的switch表达式使用示例
2020/06/03 Javascript
js 获取元素下面所有li的两种方法
2014/04/14 Javascript
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
AngularJS 视图详解及示例代码
2016/08/17 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
vite2.0+vue3移动端项目实战详解
2021/03/03 Vue.js
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
MYSQL基础面试题
2012/05/13 面试题
日期和时间问题
2015/01/04 面试题
师德个人剖析材料
2014/02/02 职场文书
党员入党表决心的话
2014/03/11 职场文书
2014年党的群众路线教育实践活动总结
2014/04/25 职场文书
身边的榜样活动方案
2014/08/20 职场文书
拾金不昧表扬信怎么写
2015/05/04 职场文书
获奖感言一句话
2015/07/31 职场文书
2016年优秀共青团员事迹材料
2016/02/25 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python