微信小程序图片保存到本地问题解决回顾

背景

最近接到一个小程序保存二维码到本地的需求,以保证用户分享进行推广。看看似简单的一个小需求,其实还是挺麻烦的,为大家分享下(这里项目使用了Taro小程序是一样的)。

步骤

查看文档发现是现成的,很简单。

代码如下

// 图片下载
async downloadImage() {
  try {
    /**
    * @param {String} src  网络图片地址
    */
    const { path } = Taro.getImageInfo({ src })


    // 保存到相册
    const saveRet = await Taro.saveImageToPhotosAlbum({ filePath: path })


    if(saveRet.errMsg == 'saveImageToPhotosAlbum:ok') {
      Taro.showToast({
        title: '图片保存成功'
      })
    }
    
  } catch (error) {
    console.log(error)
  }
}

感觉好像是完事了,但其实还早,这才刚刚开始,刺激的在后面。

授权

调用相册是需要用户授权的,用户授权了还好,要是没有授权(用户选择了拒绝),就不能再进行图片下载,且没有什么提示,用户体验极差,怎么办呢。

最好的办法还是对用户进行引导。如果用户选择了拒绝,当用户再次打开此页面的时候,那么我们将下载的按钮进行替换成授权相册。引导用户手动打开相册权限进行图片的下载。

贴上代码供各位看官参考

async openSetting() {
  // 打开设置(手动授权)
  const ret = await Taro.openSetting()
  if(ret.authSetting['scope.writePhotosAlbum']) {
    this.setState({
      writePhotosAlbum: true // 权限开启状态
    })
  }
}

兼容性

本以为这样就结束了,奈何QA同学又过来找,在个别安卓手机上下载不了,表现为点击保存没有任何反应(文件类型识别失败)。

发现其实是getImageInfo这个方法获取不到图片信息报错导致的,惊慌失措中寻找是否有替代方案。downloadFile是用来保存文件到本地的缓存中,存储临时地址。想到图片其实也是属于文件,尝试是否可以借助这个方法实现。

  
// 获取临时文件路径
  const filePath = `${wx.env.USER_DATA_PATH}/${Date.now()}.jpg`
  // 通过获取本地临时文件路径进行图片的保存,此文件路径是我们自己指定了文件类型,所以不会出现文件类型识别失败的情况。
  const { path } = await Taro.downloadFile({
    url,
    filePath // 强行指定文件类型(.jpg)
  })
  // 图片保存
  const saveRet = await Taro.saveImageToPhotosAlbum({
    filePath: path
  })


  if(saveRet.errMsg == 'saveImageToPhotosAlbum:ok') {
    Taro.showToast({
      title: '图片保存成功'
    })


    // 保存成功之后移除缓存释放机身空间
    let fileMgr = Taro.getFileSystemManager()


    fileMgr.unlink({ filePath })
  }

这样实现之后是可以的,正好避过了getImageInfo获取图片类型(.png|.jpg)不成功的情况,如果各位小伙伴也遇到类似的场景,可以尝试将保存的代码修改成上面这种,能避免一些不必要的问题,如果有更好的办法,也请告知,欢迎一起学习讨论。祝工作顺利!

推荐阅读

好文我在看????

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值