在微信小程序中保存网络图片


Posted in Javascript onFebruary 12, 2019

微信代码片段点这里, 该功能需要添加appid才能进行正常的测试。

在小程序的文档中我们得知,wx.saveImageToPhotosAlbum 是用来保存图片到相册的。

但是仔细一看会发现这个接口的filePath参数只接受临时文件路径或永久文件路径,不支持网络图片路径,意味着我们不能直接调用这个接口。。

因此先需要把该文件下载至本地,使用 wx.downloadFile 。

但值得注意的是小程序只可以跟指定的域名与进行网络通信,也就是说下载图片之前,我们需要先去微信公众者平台的开发设置里设置uploadFile合法域名。

示例代码如下:

<!-- index.wxml -->
<image class="qr-code" src="{{url}}" mode="aspectFill" />
<button class="text" bindtap="saveImage">保存图片</button>
// index.js
const app = getApp()

Page({
 data: {
  url: 'https://avatars3.githubusercontent.com/u/23024075?s=460&v=4'
 },

 // 保存图片
 saveImage() {
  this.wxToPromise('downloadFile', {
    url: this.data.url
   })
   .then(res => this.wxToPromise('saveImageToPhotosAlbum', {
    filePath: res.tempFilePath
   }))
   .then(res => {
    // do something
    wx.showToast({ title: '保存成功~',icon: 'none' });
   })
   .catch(err) => {
    console.log(err);

    // 如果是用户自己取消的话保存图片的话
    // if (~err.errMsg.indexOf('cancel')) return;
   })
 },

 /**
  * 将 callback 转为易读的 promise
  * @returns [promise]
  */
 wxToPromise(method, opt) {
  return new Promise((resolve, reject) => {
   wx[method]({
    ...opt,
    success(res) {
     opt.success && opt.success();
     resolve(res)
    },
    fail(err) {
     opt.fail && opt.fail();
     reject(err)
    }
   })
  });
 },
})

然后理论上就可以保存图片了... 用户第一次在我们的小程序使用保存图片这个功能是会弹出一个授权弹框,如果用户手滑点了拒绝授权后再点一次保存图片,然后就会发现什么反应都没有了。。。

出现这样的原因是因为这个授权弹框只会出现一次,所以我们得想办法再让用户重新授权一次。这时就想到使用 wx.authorize .

但是经过测试后发现,使用 wx.authorize 后,会报 authorize:fail auth deny 的错误。然后经过查阅资料得知:

  • 如果用户未接受或拒绝过此权限,会弹窗询问用户,用户点击同意后方可调用接口;
  • 如果用户已授权,可以直接调用接口;
  • 如果用户已拒绝授权,则不会出现弹窗,而是直接进入接口 fail 回调。请开发者兼容用户拒绝授权的场景。

emmm... 那这样效果当然不符合我们预期,只能在换一种方式。这时就想到了使用<button open-type="openSetting"/>,在交互上做一个提示弹框,引导用户重新授权:

<image class="qr-code" src="{{url}}" mode="aspectFill" />
<button class="text" bindtap="saveImage">保存图片</button>

<!-- 简陋版提示 -->
<view wx:if="{{showDialog}}" class="dialog-wrap">
 <view class="dialog">
  这是一段提示用户授权的提示语
  <view class="dialog-footer">
   <button
    class="btn"
    open-type="openSetting"
    bindtap="confirm" >
     授权
   </button>
   <button class="btn" bindtap="cancel">取消</button>
  </view>
 </view>
</view>
const app = getApp()

Page({
 data: {
  url: 'https://avatars3.githubusercontent.com/u/23024075?s=460&v=4',
  showDialog: false,
 },

 saveImage() {
  this.wxToPromise('downloadFile', {
    url: this.data.url
   })
   .then(res => this.wxToPromise('saveImageToPhotosAlbum', {
    filePath: res.tempFilePath
   }))
   .then(res => {
    console.log(res);
    // this.hide();
    wx.showToast({
     title: '保存成功~',
     icon: 'none',
    });
   })
   .catch(({ errMsg }) => {
    console.log(errMsg)
    // if (~errMsg.indexOf('cancel')) return;
    if (!~errMsg.indexOf('auth')) {
     wx.showToast({ title: '图片保存失败,稍后再试', icon: 'none' });
    } else {
     // 调用授权提示弹框
     this.setData({
      showDialog: true
     })
    };
   })
 },

 // callback to promise
 wxToPromise(method, opt) {
  return new Promise((resolve, reject) => {
   wx[method]({
    ...opt,
    success(res) {
     opt.success && opt.success();
     resolve(res)
    },
    fail(err) {
     opt.fail && opt.fail();
     reject(err)
    }
   })
  });
 },

 confirm() {
  this.setData({
   showDialog:false
  })
 },

 cancel() {
  this.setData({
   showDialog: false
  })
 }
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用js生产批量批处理执行命令
Jul 28 Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
Jun 11 Javascript
javascript中AJAX用法实例分析
Jan 30 Javascript
高性能JavaScript DOM编程(1)
Aug 11 Javascript
详解JavaScript中的构造器Constructor模式
Jan 14 Javascript
js实现网页图片延时加载 提升网页打开速度
Jan 26 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
Mar 29 Javascript
vue.js实现备忘录功能的方法
Jul 10 Javascript
基于wordpress的ajax写法详解
Jan 02 Javascript
微信小程序实现漂亮的弹窗效果
May 26 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
May 16 Javascript
解决layui调用自定义方法提示未定义的问题
Sep 14 Javascript
VUE中使用MUI方法
Feb 12 #Javascript
如何利用ES6进行Promise封装总结
Feb 11 #Javascript
在vue项目中引入vue-beauty操作方法
Feb 11 #Javascript
Vue表单控件绑定图文详解
Feb 11 #Javascript
图文讲解vue的v-if使用方法
Feb 11 #Javascript
ES6 如何改变JS内置行为的代理与反射
Feb 11 #Javascript
ES6 更易于继承的类语法的使用
Feb 11 #Javascript
You might like
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
基于jQuery的消息提示插件 DivAlert之旅(二)
2010/04/01 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
js实现省份下拉菜单效果
2017/02/15 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
微信小程序页面生命周期详解
2018/01/31 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
关于python的bottle框架跨域请求报错问题的处理方法
2017/03/19 Python
修改默认的pip版本为对应python2.7的方法
2018/11/06 Python
django框架实现一次性上传多个文件功能示例【批量上传】
2019/06/19 Python
python实现图片插入文字
2019/11/26 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
Python如何爬取qq音乐歌词到本地
2020/06/01 Python
python里反向传播算法详解
2020/11/22 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
2021/01/11 Python
CSS 3.0 结合video视频实现的创意开幕效果
2020/06/01 HTML / CSS
Volcom法国官网:美国冲浪滑板品牌
2017/05/25 全球购物
教师自我鉴定范文
2013/11/10 职场文书
2014端午节活动策划方案
2014/01/27 职场文书
文明餐桌活动方案
2014/02/11 职场文书
公司试用期员工自我评价
2014/09/17 职场文书
标准单位租车协议书
2014/09/23 职场文书
地方白酒代理协议书
2014/10/25 职场文书
合作合同协议书范本
2015/01/27 职场文书
2015年服务员工作总结
2015/04/08 职场文书
拾金不昧通报表扬范文
2015/05/05 职场文书
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python
如何使用PyCharm及常用配置详解
2021/06/03 Python