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


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 相关文章推荐
javascript addBookmark 加入收藏 多浏览器兼容
Aug 15 Javascript
再说AutoComplete自动补全之实现原理
Nov 05 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
May 26 Javascript
javascript实现倒计时N秒后网页自动跳转代码
Dec 11 Javascript
JavaScript中的异常捕捉介绍
Dec 31 Javascript
JavaScript中的函数嵌套使用
Jun 04 Javascript
利用Node.js制作爬取大众点评的爬虫
Sep 22 Javascript
浅谈 Vue v-model指令的实现原理
Jun 08 Javascript
Easyui使用Dialog行内按钮布局的实例
Jul 27 Javascript
js canvas实现橡皮擦效果
Dec 20 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
May 07 Javascript
javascript+css实现进度条效果
Mar 25 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 file_exists无效的解决办法
2013/06/26 PHP
yii数据库的查询方法
2015/12/28 PHP
php关联数组与索引数组及其显示方法
2018/03/12 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
jquery 判断滚动条到达了底部和顶端的方法
2014/04/02 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
javascript倒计时效果实现
2015/11/12 Javascript
微信小程序获取循环元素id以及wx.login登录操作
2017/08/17 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
element-ui组件table实现自定义筛选功能的示例代码
2019/03/15 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
python去掉字符串中重复字符的方法
2014/02/27 Python
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
python3新特性函数注释Function Annotations用法分析
2016/07/28 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
python画图常规设置方式
2020/03/05 Python
python中selenium库的基本使用详解
2020/07/31 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
宝宝周岁宴答谢词
2014/01/26 职场文书
活动志愿者自荐信
2014/01/27 职场文书
银行见习期自我鉴定
2014/01/29 职场文书
数控技术应用个人求职信范文
2014/02/03 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
毕业生捐书活动倡议书
2015/04/27 职场文书
化工厂员工工作总结
2015/10/15 职场文书
2015年幼儿园班主任个人工作总结
2015/10/22 职场文书
python 制作一个gui界面的翻译工具
2021/05/14 Python