详解微信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代码格式化和语法着色V2
Oct 14 Javascript
一个高效的JavaScript压缩工具下载集合
Mar 06 Javascript
“不能执行已释放的Script代码”错误的原因及解决办法
Sep 09 Javascript
两个listbox实现选项的添加删除和搜索
Mar 01 Javascript
js去除空格的12种实用方法
Nov 08 Javascript
自定义百度分享的分享按钮
Mar 18 Javascript
javascript中对变量类型的判断方法
Aug 09 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
Aug 15 Javascript
详解vue页面首次加载缓慢原因及解决方案
Nov 06 Javascript
JS window对象简单操作完整示例
Jan 14 Javascript
JS数组扁平化、去重、排序操作实例详解
Feb 24 Javascript
vue $mount 和 el的区别说明
Sep 11 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在多维数组中根据键名快速查询其父键以及父键值的代码
2011/05/07 PHP
php基于curl扩展制作跨平台的restfule 接口
2015/05/11 PHP
PHP 绘制网站登录首页图片验证码
2016/04/12 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
javascript 面向对象编程基础 多态
2009/08/21 Javascript
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
js跑马灯代码(自写)
2013/04/17 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
2015/03/17 Javascript
Jquery简单实现GridView行高亮的方法
2015/06/15 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
node.js 微信开发之定时获取access_token
2020/02/07 Javascript
在 Vue 中编写 SVG 图标组件的方法
2020/02/24 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
[01:01:36]Optic vs paiN 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
2013/12/06 Python
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
Python中print函数简单使用总结
2019/08/05 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
Kmeans均值聚类算法原理以及Python如何实现
2020/09/26 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
高中毕业生自我鉴定范文
2013/09/26 职场文书
如何写自我评价?自我评价写什么好?
2014/03/14 职场文书
2015年学生会部门工作总结
2015/04/21 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书
Redis三种集群模式详解
2021/10/05 Redis
利用JavaScript写一个简单计算器
2021/11/27 Javascript
索尼ICF-5900W收音机测评
2022/04/24 无线电