详解微信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让返回的内容显示在特定div里(代码少而精悍)
Jun 23 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
Oct 14 Javascript
jquery制作 随机弹跳的小球特效
Feb 01 Javascript
Javascript编写2048小游戏
Jul 07 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
Oct 30 Javascript
JavaScript对Json的增删改属性详解
Jun 02 Javascript
Vue2 监听属性改变watch的实例代码
Aug 27 Javascript
原生JS实现前端本地文件上传
Sep 08 Javascript
js实现图片跟随鼠标移动效果
Oct 16 Javascript
OpenLayer3自定义测量控件MeasureTool
Sep 28 Javascript
Javascript中的解构赋值语法详解
Apr 02 Javascript
vue实现可拖拽的dialog弹框
May 13 Vue.js
解决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
一条久听不愿放下的DIY森海MX500,三言两语话神奇
2021/03/02 无线电
php实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
Windows服务器中PHP如何安装redis扩展
2019/09/27 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
学习ExtJS(一) 之基础前提
2009/10/07 Javascript
Extjs中常用表单介绍与应用
2010/06/07 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
基于javascript的JSON格式页面展示美化方法
2014/07/02 Javascript
js实现鼠标悬浮给图片加边框的方法
2015/01/30 Javascript
推荐10 个很棒的 jQuery 特效代码
2015/10/04 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
AngularJS删除路由中的#符号的方法
2016/09/20 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
python访问纯真IP数据库的代码
2011/05/19 Python
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
Python获取邮件地址的方法
2015/07/10 Python
Python内置函数 next的具体使用方法
2017/11/24 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
python保存二维数组到txt文件中的方法
2018/11/15 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
matplotlib绘制多子图共享鼠标光标的方法示例
2021/01/08 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
上海中网科技笔试题
2012/02/19 面试题
讲文明懂礼貌演讲稿
2014/09/11 职场文书
创业计划书之甜品店
2019/09/18 职场文书