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 序列化对象实现代码
Dec 18 Javascript
webapp框架AngularUI的demo改造之路
Dec 21 Javascript
jquery实现相册一下滑动两次的方法
Feb 09 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
Mar 03 Javascript
JavaScript的jQuery库中ready方法的学习教程
Aug 14 Javascript
Web打印解决方案之证件套打的实现思路
Aug 29 Javascript
AngularJS自定义控件实例详解
Dec 13 Javascript
jquery点赞功能实现代码 点个赞吧!
May 29 jQuery
angular2路由切换改变页面title的示例代码
Aug 23 Javascript
微信小程序实现的动态设置导航栏标题功能示例
Jan 31 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
Jul 25 Javascript
JS定时器如何实现提交成功提示功能
Jun 12 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生成Android客户端扫描可登录的二维码
2016/05/13 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
Mootools 1.2教程 滚动条(Slider)
2009/09/15 Javascript
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
jQuery中$.each使用详解
2015/01/29 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
SpringMVC+bootstrap table实例详解
2017/06/02 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
Vue常用的几个指令附完整案例
2018/11/06 Javascript
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
[46:55]完美世界DOTA2联赛决赛 FTD vs Phoenix 第三场 11.08
2020/11/11 DOTA
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
Python实现遍历windows所有窗口并输出窗口标题的方法
2015/03/13 Python
Python selenium如何设置等待时间
2016/09/15 Python
python常见排序算法基础教程
2017/04/13 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
浅谈Python反射 &amp; 单例模式
2019/03/21 Python
Python/Django后端使用PIL Image生成头像缩略图
2019/04/30 Python
基于Python的PIL库学习详解
2019/05/10 Python
Python实现蒙特卡洛算法小实验过程详解
2019/07/12 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
如何利用Python 进行边缘检测
2020/10/14 Python
AmazeUI的JS表单验证框架实战示例分享
2020/08/21 HTML / CSS
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
.NET初级开发工程师面试题
2014/04/18 面试题
财务工作者先进事迹材料
2014/01/17 职场文书
自信主题班会
2015/08/14 职场文书
python 学习GCN图卷积神经网络
2022/05/11 Python