详解微信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 获取浏览器高度和宽度值(多浏览器)
Sep 02 Javascript
利用JS重写Cognos右键菜单的实现代码
Apr 11 Javascript
客户端 使用XML DOM加载json数据的方法
Sep 28 Javascript
潜说js对象和数组
May 25 Javascript
js与运算符和或运算符的妙用
Feb 14 Javascript
Bootstrap编写导航栏和登陆框
May 30 Javascript
老生常谈onBlur事件与onfocus事件(js)
Jul 09 Javascript
JavaScript中浅讲ajax图文详解
Nov 11 Javascript
JavaScript对象封装的简单实现方法(3种方法)
Jan 03 Javascript
canvas绘制万花筒效果(代码分享)
Jan 20 Javascript
Vue2 使用 Echarts 创建图表实例代码
May 18 Javascript
React-native桥接Android原生开发详解
Jan 17 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文本数据库的搜索方法
2006/10/09 PHP
header跳转和include包含问题详解
2012/09/08 PHP
PHP中如何判断exec函数执行成功?
2016/08/04 PHP
newxtree.js代码
2007/03/13 Javascript
通过JS来判断页面控件是否获取焦点
2014/01/03 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
2014/10/11 Javascript
JsRender for object语法简介
2014/10/31 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
JavaScript编写一个贪吃蛇游戏
2017/03/09 Javascript
vue中的数据绑定原理的实现
2018/07/02 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
Vue——解决报错 Computed property "****" was assigned to but it has no setter.
2020/12/19 Vue.js
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
python动态加载变量示例分享
2014/02/17 Python
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
Python+微信接口实现运维报警
2016/08/27 Python
spark: RDD与DataFrame之间的相互转换方法
2018/06/07 Python
详解TensorFlow查看ckpt中变量的几种方法
2018/06/19 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
使用Python快速制作可视化报表的方法
2019/02/03 Python
python实现全盘扫描搜索功能的方法
2019/02/14 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
Python3操作MongoDB增册改查等方法详解
2020/02/10 Python
Django与pyecharts结合的实例代码
2020/05/13 Python
pymysql模块使用简介与示例
2020/11/17 Python
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
无故旷工检讨书
2014/01/26 职场文书
安全标准化汇报材料
2014/02/03 职场文书
2014年国培研修感言
2014/03/09 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
Golang生成Excel文档的方法步骤
2021/06/09 Golang