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


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 相关文章推荐
input、button的不同type值在ajax提交表单时导致的陷阱
Feb 24 Javascript
分享十五个最佳jQuery 幻灯插件和教程
Mar 27 Javascript
javascript delete 使用示例代码
Mar 29 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
Sep 17 Javascript
js实现回放拖拽轨迹从过程上进行分析
Jun 26 Javascript
使用JavaScript开发IE浏览器本地插件实例
Feb 18 Javascript
Angular中的Promise对象($q介绍)
Mar 03 Javascript
javascript实现九宫格相加数值相等
May 28 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
Jan 16 Javascript
详解vue-router 命名路由和命名视图
Jun 01 Javascript
webpack4 入门最简单的例子介绍
Sep 05 Javascript
优雅的处理vue项目异常实战记录
Jun 05 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许愿墙模块功能分析
2013/06/25 PHP
PHP实现数组根据某个单元字段排序操作示例
2018/08/01 PHP
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
Javascript中call和apply函数的比较和使用实例
2015/02/03 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
js返回顶部实例分享
2016/12/21 Javascript
网页中的图片查看器viewjs使用方法
2017/07/11 Javascript
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
JS兼容所有浏览器的DOMContentLoaded事件
2018/01/12 Javascript
微信小程序实现倒计时补零功能
2018/07/09 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
python re模块findall()函数实例解析
2018/01/19 Python
详谈python中冒号与逗号的区别
2018/04/18 Python
Python GUI布局尺寸适配方法
2018/10/11 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
Python+PyQt5实现灭霸响指功能
2020/05/25 Python
python中xlrd模块的使用详解
2021/02/01 Python
基于CSS3特效之动画:animation的应用
2013/05/09 HTML / CSS
HTML5 语义化结构化规范化
2008/10/17 HTML / CSS
NEW LOOK官网:英国时装零售巨头之一,快时尚品牌
2017/01/11 全球购物
有关九一八事变的演讲稿
2014/09/14 职场文书
交通违章检讨书
2014/09/21 职场文书
作风建设整改方案
2014/10/27 职场文书
防溺水主题班会教案
2015/08/12 职场文书
2016年社会管理综治宣传月活动总结
2016/03/16 职场文书
Python软件包安装的三种常见方法
2022/07/07 Python