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


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表单提交的代码
Sep 13 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
Aug 16 Javascript
javascript的document.referrer浏览器支持、失效情况总结
Jul 18 Javascript
jQuery实现锚点scoll效果实例分析
Mar 10 Javascript
AngularJs html compiler详解及示例代码
Sep 01 Javascript
浅析BootStrap Treeview的简单使用
Oct 12 Javascript
jQuery实现拖动效果的实例代码
Jun 25 jQuery
JS获取一个表单字段中多条数据并转化为json格式
Oct 17 Javascript
vue 将页面公用的头部组件化的方法
Dec 18 Javascript
JS实现动态生成html table表格的方法分析
Jul 11 Javascript
layui时间控件选择时间范围的实现方法
Sep 28 Javascript
Javascript异步流程控制之串行执行详解
Sep 27 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实现的简单日历类
2014/11/29 PHP
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
PHP编译安装时常见错误解决办法
2015/05/28 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
php实现简单加入购物车功能
2017/03/07 PHP
创建无限极分类树型结构的简单方法
2017/06/20 PHP
深入研究PHP中的preg_replace和代码执行
2018/08/15 PHP
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
jQuery实现hover合成事件的方法
2015/08/06 Javascript
angularjs学习笔记之完整的项目结构
2015/09/26 Javascript
原生javascript实现匀速运动动画效果
2016/02/26 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
JS扩展String.prototype.format字符串拼接的功能
2018/03/09 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
scikit-learn线性回归,多元回归,多项式回归的实现
2019/08/29 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
Oracle快照(snapshot)
2015/03/13 面试题
软件测试题目
2013/02/27 面试题
后勤人员自我评价怎么写
2013/09/19 职场文书
办公室文秘自我评价
2013/09/21 职场文书
教师评优事迹材料
2014/01/10 职场文书
和平主题的演讲稿
2014/01/12 职场文书
安全责任书范本
2014/04/15 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
2014年纪检工作总结
2014/11/12 职场文书
就业意向协议书
2015/01/29 职场文书
任命通知范文
2015/04/21 职场文书
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫