详解微信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 相关文章推荐
获取元素距离浏览器周边的位置的方法getBoundingClientRect
Apr 17 Javascript
js 弹出框只弹一次(二次修改之后的)
Nov 26 Javascript
js控制input框只读实现示例
Jan 20 Javascript
JavaScript日期类型的一些用法介绍
Mar 02 Javascript
javascript实现动态改变层大小的方法
May 14 Javascript
jquery判断密码强度的验证代码
Apr 22 Javascript
JavaScript获取客户端IP的方法(新方法)
Mar 11 Javascript
从0开始学Vue
Oct 27 Javascript
各种选择框jQuery的选中方法(实例讲解)
Jun 27 jQuery
vue2中,根据list的id进入对应的详情页并修改title方法
Aug 24 Javascript
node实现简单的增删改查接口实例代码
Aug 22 Javascript
jQuery实现html可联动的百分比进度条
Mar 26 jQuery
解决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 similar_text 字符串的相似性比较函数
2010/05/26 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
为你总结一些php信息函数
2015/10/21 PHP
yii的入口文件index.php中为什么会有这两句
2016/08/04 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
js静态方法与实例方法分析
2011/07/04 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
JS不能跨域借助jquery获取IP地址的方法
2014/08/20 Javascript
javascript Deferred和递归次数限制实例
2014/10/21 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
js实现登录验证码
2016/12/22 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
vue数据双向绑定原理解析(get & set)
2017/03/08 Javascript
JavaScript同源策略和跨域访问实例详解
2018/04/03 Javascript
详解.vue文件中style标签的几个标识符
2018/07/17 Javascript
基于vue实现一个神奇的动态按钮效果
2019/05/15 Javascript
vue实现路由切换改变title功能
2019/05/28 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
Javascript var变量删除原理及实现
2020/08/26 Javascript
python中数据爬虫requests库使用方法详解
2018/02/11 Python
Python使用random.shuffle()打乱列表顺序的方法
2018/11/08 Python
Python线程之定位与销毁的实现
2019/02/17 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
python 检测图片是否有马赛克
2020/12/01 Python
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
意大利奢华内衣制造商:Cosabella
2017/08/29 全球购物
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
《在山的那边》教学反思
2014/02/23 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
毕业典礼邀请函
2015/01/31 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书
Java无向树分析 实现最小高度树
2022/04/09 Javascript