详解微信JS-SDK选择图片遇到的坑


Posted in Javascript onAugust 15, 2018

有个需求要在微信企业号里面做开发,有个功能是选择图片,使用input标签肯定是不管用了,Android手机上不能多选,所以使用了微信的JS-SDK提供的相关API,这个地方真的是有坑,记录一下。按照文档直接引入js文件即可,如果使用的是Vue,也可以使用weixin-js-sdk,两种方式都可以。

图片在Android上无法预览

js-sdk的chooseImage 接口返回的结果是localId,类似于wxLocalResource://xxxxxx,如果想得到它的base64串需要再调用getLocalImgData方法,因为我们后台接口里需要用到这个base64串,所以通过这个接口来获取base64串作展示,而不是用文档里介绍的方法。那这里有个坑,从Android获取的localData是不带有base64前缀的,要处理一下。

selectImage: function () {
  let context = this;
  wx.chooseImage({
    count: 9,
    sizeType: ['compressed'], 
    sourceType: ['album', 'camera'], 
    defaultCameraMode: "normal", 
    success: function (res) {
      // localIds是在data里定义的一个localId数组
      context.localIds = res.localIds;
      // 不能直接遍历这个数组
      context.updateBase64Data(context.localIds.shift());
    },
    fail: function (res) {
      alert('选择图片失败:' + res.errMsg);
    },
  });
},
updateBase64Data: function (localId) {
  let context = this;
  wx.getLocalImgData({
    localId: localId, // 图片的localID
    success: function (res) {
      let localData = res.localData;
      let prefix = 'base64,';
      let index = localData.indexOf(prefix);
      let actData = localData;
      // 我现在是设置参数,如果是展示的话则应该是添加头部data:image/jpeg;base64,
      if (index > -1) {
        actData = localData.substring(index + 7);
      }
      // base64Array是在data里定义的一个base64串数组
      context.base64Array.push(actData);
      
      if (context.localIds.length > 0) {
        context.updateBase64Data(context.loaclIds.shift());
      } else {
        // 执行处理
      }
    },
    fail: function (res) {
      alert('选择图片失败:' + res.errMsg);
    },
  });
},

getLocalImgData获取多张图片无响应

chooseImage方法获取到是一个localId的数组,如果直接遍历这个数组去调用getLocalImgData时它只会执行一次,后面的无论怎样都不会执行,猜测应该是跟它localId的获取有关系。所以采取了上面代码中递归的方式调用,当连续调用uploadImage上传图片时也要这么做。

Android无法选择原图

尽管在chooseImage方法可以通过sourceType字段指定是原图还是压缩后的图,但是只要调用了getLocalImgData方法,那获取到的base64串展示一定是模糊的。你在想是不是Android上面不能使用原图啊,错了,仔细看IOS上面的图也是不清楚的,测试发现确实是这样,原图1.8M,使用js-sdk选择的原图只有不到240K,那为什么Android会模糊但是IOS比较清楚呢,你是不是又想这不是IOS和Android系统的区别吧,把同一张图片通过getLocalImgData方法获取到的base64串做比对发现,Android上得到的base64串前缀是以gCM开头,而IOS则是以/9j/开头,从PC上选择的图也是以/9j/开头,自己解析的图片也是以/9j/开头,所以不是因为压缩变模糊了,是因为使用了不一样的编码变模糊了。如果真的想选择原图,先把图片上传到微信服务器,然后使用获取临时素材的接口https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID,把图片下载下来,经测试这样其实也是有压缩的,这个是企业号的API如果用公众号地址是https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID。代码就不贴了,与上面的基本一致。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
读jQuery之九 一些瑕疵说明
Jun 21 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
Dec 11 Javascript
JS中setTimeout()的用法详解
Apr 14 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
Sep 13 Javascript
JQuery radio(单选按钮)操作方法汇总
Apr 15 Javascript
jQuery实现商品活动倒计时
Oct 16 Javascript
Vue数据驱动模拟实现1
Jan 11 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
Jan 20 Javascript
使用canvas及js简单生成验证码方法
Apr 02 Javascript
JS实现数组按升序及降序排列的方法
Apr 26 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
Jul 17 Javascript
JS轻量级函数式编程实现XDM三
Jun 16 Javascript
解决layui中的form表单与button的点击事件冲突问题
Aug 15 #Javascript
jQuery仿移动端支付宝键盘的实现代码
Aug 15 #jQuery
layui 监听表格复选框选中值的方法
Aug 15 #Javascript
Node.js搭建WEB服务器的示例代码
Aug 15 #Javascript
Layui 设置select下拉框自动选中某项的方法
Aug 14 #Javascript
vue升级之路之vue-router的使用教程
Aug 14 #Javascript
layui table 参数设置方法
Aug 14 #Javascript
You might like
php下使用iconv需要注意的问题
2010/11/20 PHP
让PHP更快的提供文件下载的代码
2012/06/13 PHP
PHP基础知识介绍
2013/09/17 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
JavaScript 高级篇之函数 (四)
2012/04/07 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
JS动态增删表格行的方法
2016/03/03 Javascript
jQuery插件扩展测试实例
2016/06/21 Javascript
15位和18位身份证JS校验的简单实例
2016/07/18 Javascript
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
2018/08/09 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
vue项目引入ts步骤(小结)
2019/10/31 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
Python如何实现文本转语音
2016/08/08 Python
基于Python的接口测试框架实例
2016/11/04 Python
python字符串str和字节数组相互转化方法
2017/03/18 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
Python 常用模块 re 使用方法详解
2019/06/06 Python
基于python实现删除指定文件类型
2020/07/21 Python
Python中的面向接口编程示例详解
2021/01/17 Python
幼教毕业生自我鉴定
2014/01/12 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
小学生作文评语集锦
2014/12/25 职场文书
贪污检举信范文
2015/03/02 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
常用的文件对应的MIME类型汇总
2022/04/26 HTML / CSS