详解微信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表格万条数据瞬间加载实现代码
Feb 20 Javascript
控制台报错object is not a function的解决方法
Aug 24 Javascript
JavaScript和CSS交互的方法汇总
Dec 02 Javascript
精通JavaScript的this关键字
May 28 Javascript
jquery实现一个简单的表单验证实例
Mar 30 Javascript
jquery dataview数据视图插件使用方法
Dec 23 Javascript
12个非常有用的JavaScript技巧
May 17 Javascript
Javasript设计模式之链式调用详解
Apr 26 Javascript
vue实现引入本地json的方法分析
Jul 12 Javascript
vue里input根据value改变背景色的实例
Sep 29 Javascript
js canvas实现二维码和图片合成的海报
Nov 19 Javascript
详解angular2 控制视图的封装模式
Dec 27 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
UCenter中的一个可逆加密函数authcode函数代码
2010/07/20 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
深入理解PHP内核(一)
2015/11/10 PHP
php中请求url的五种方法总结
2017/07/13 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
2019/10/12 PHP
在html页面中包含共享页面的方法
2008/10/24 Javascript
网页中的图片的处理方法与代码
2009/11/26 Javascript
模仿百度三维地图的js数据分享
2011/05/12 Javascript
jQuery使用$.ajax进行即时验证实例详解
2015/12/11 Javascript
JavaScript来实现打开链接页面的简单实例
2016/06/02 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
移动端日期插件Mobiscroll.js使用详解
2016/12/19 Javascript
jQuery弹出层插件popShow(改进版)用法示例
2017/01/23 Javascript
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
Python写的Socks5协议代理服务器
2014/08/06 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
Python内置函数——__import__ 的使用方法
2017/11/24 Python
Python线性回归实战分析
2018/02/01 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
解读python如何实现决策树算法
2018/10/11 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
django如何自己创建一个中间件
2019/07/24 Python
Python 添加文件注释和函数注释操作
2020/08/09 Python
欧洲最大的高尔夫零售商:American Golf
2019/09/02 全球购物
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
应届生骨科医生求职信
2013/10/31 职场文书
关于毕业的中学校园广播稿
2014/01/26 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
Redis 哨兵机制及配置实现
2022/03/25 Redis
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers