详解微信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 相关文章推荐
脚本之家贴图转换+转贴工具用到的js代码超级推荐
Apr 05 Javascript
JavaScript 获得选中文本内容的方法
Feb 15 Javascript
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
Jul 25 Javascript
JS中实现replaceAll的方法(实例代码)
Nov 12 Javascript
node.js使用nodemailer发送邮件实例
Mar 10 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
Sep 20 Javascript
关于webuploader插件使用过程遇到的小问题
Nov 07 Javascript
Node.js使用Koa搭建 基础项目
Jan 08 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
Feb 09 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
Mar 02 Javascript
Nuxt配合Node在实际生产中的应用详解
Aug 07 Javascript
Vue实现表格中对数据进行转换、处理的方法
Sep 06 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(4) php 函数 补充2
2010/02/15 PHP
php数组函数序列之array_keys() - 获取数组键名
2011/10/30 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
php 数据结构之链表队列
2017/10/17 PHP
PHP简单实现防止SQL注入的方法
2018/03/13 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
XHTML下,JS浮动代码失效的问题
2009/11/12 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
jQuery的Ajax的自动完成功能控件简要说明
2013/02/22 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
vue实现行列转换的一种方法
2019/08/06 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
Windows8下安装Python的BeautifulSoup
2015/01/22 Python
tensorflow 中对数组元素的操作方法
2018/07/27 Python
python3 反射的四种基本方法解析
2019/08/26 Python
Tensorflow的常用矩阵生成方式
2020/01/04 Python
Python super()方法原理详解
2020/03/31 Python
Django如何使用redis作为缓存
2020/05/21 Python
python解包用法详解
2021/02/17 Python
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
公司合并协议书范本
2014/09/30 职场文书
学校总务处领导干部个人对照检查材料思想汇报
2014/10/06 职场文书
2015年质检工作总结
2015/05/04 职场文书
在职证明格式样本
2015/06/15 职场文书
会计专业自荐信范文
2019/05/22 职场文书