详解微信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 相关文章推荐
IE与Firefox下javascript getyear年份的兼容性写法
Dec 20 Javascript
jquery 图片Silhouette Fadeins渐显效果
Feb 07 Javascript
使用dynatrace-ajax跟踪JavaScript的性能
Apr 12 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
Nov 04 Javascript
JavaScript中number转换成string介绍
Dec 31 Javascript
实例详解jQuery的无new构建
Aug 02 Javascript
Vue中之nextTick函数源码分析详解
Oct 17 Javascript
解决VUEX兼容IE上的报错问题
Mar 01 Javascript
在Vue中使用Compass的方法
Mar 02 Javascript
微信小程序实现获取小程序码和二维码java接口开发
Mar 29 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
Sep 05 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
Jun 15 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
如何取得中文字符串中出现次数最多的子串
2013/08/08 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
JS target与currentTarget区别说明
2011/08/28 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
2014/09/25 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
JavaScript学习总结之JS、AJAX应用
2016/01/29 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
[01:17:12]职来职往完美电竞专场
2014/09/18 DOTA
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
Python中的map、reduce和filter浅析
2014/04/26 Python
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
Python3 元组tuple入门基础
2020/02/09 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
HTML5中的autofocus(自动聚焦)属性介绍
2014/04/23 HTML / CSS
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
印度最好的在线药品订购网站:PharmEasy
2018/11/30 全球购物
日本最大的购物网站乐天市场国际版:Rakuten Global Market(支持中文)
2020/02/03 全球购物
自荐信格式技巧有哪些呢
2013/11/19 职场文书
英语专业毕业生自荐信范文
2013/12/31 职场文书
审计班子对照检查材料
2014/08/27 职场文书
撤诉申请怎么写
2015/05/19 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang
MySQL创建表操作命令分享
2022/03/25 MySQL
python游戏开发Pygame框架
2022/04/22 Python