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 相关文章推荐
基于jquery的获取mouse坐标插件的实现代码
Apr 01 Javascript
document.createElement()用法
Mar 13 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
Mar 14 Javascript
javascript数组排序汇总
Jul 07 Javascript
jQuery实现带动画效果的多级下拉菜单代码
Sep 08 Javascript
js实现新年倒计时效果
Dec 10 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
Mar 06 Javascript
JS获取子窗口中返回的数据实现方法
May 28 Javascript
针对JavaScript中this指向的简单理解
Aug 26 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
Feb 23 Javascript
Vue axios 中提交表单数据(含上传文件)
Jul 06 Javascript
angularJS1 url中携带参数的获取方法
Oct 09 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
php与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
成为好程序员必须避免的5个坏习惯
2014/07/04 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
基于json的jquery地区联动效果代码
2011/07/06 Javascript
关于JavaScript中原型继承中的一点思考
2012/07/25 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
2016/04/06 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
详解jquery easyui之datagrid使用参考
2016/12/05 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
Python运算符重载用法实例分析
2015/06/01 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
Python+selenium实现截图图片并保存截取的图片
2018/01/05 Python
python ChainMap的使用和说明详解
2019/06/11 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
python绘制随机网络图形示例
2019/11/21 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
html5 canvas绘制网络字体的常用方法
2019/08/26 HTML / CSS
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
Nicole Miller官方网站:纽约女装品牌
2019/09/14 全球购物
中间件的定义
2016/08/09 面试题
服装设计行业个人的自我评价
2013/12/20 职场文书
新教师工作感言
2014/02/16 职场文书
在教室放鞭炮的检讨书
2014/09/28 职场文书
2014年商场工作总结
2014/11/22 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js