文章目录
- 一、普通下载图片
- 二、用户授权下载图片
- 三、图片文件流显示并下载
一、普通下载图片
实现功能:点击下载按钮,将图片保存到本地相册。
代码如下:
//下载图片
picDown(){
wx.downloadFile({
url: this.data.imgUrl,//图片的地址
success:function(res){
const tempFilePath = res.tempFilePath //通过res中的tempFilePath 得到需要下载的图片地址
wx.saveImageToPhotosAlbum({
filePath: tempFilePath, //设置下载图片的地址
success:function(){
}
})
}
})
},
按照官方文档,简单这样写即可,开发测试和发布测试时通常也都能正常下载。但是偶尔会遇到报错:errMsg: "saveImageToPhotosAlbum:fail auth deny"
二、用户授权下载图片
需要用户授权进行保存操作。(不明白为什么同一台手机有的时候需要授权,有的时候不需要授权呢?) 而且授权是需要弹窗支持的。
完整代码如下:
//下载图片
picDown(){
wx.downloadFile({
url: this.data.imgUrl,//图片的地址
success:function(res){
const tempFilePath = res.tempFilePath
wx.saveImageToPhotosAlbum({
filePath: tempFilePath, //设置下载图片的地址
success:function(){
wx.hideLoading()
wx.showModal({
title: '提示',
content: '图片已保存到相册',
showCancel: false,
})
},
fail: function (err) {
if (err.errMsg === "saveImageToPhotosAlbum:fail:auth denied" || err.errMsg === "saveImageToPhotosAlbum:fail auth deny" || err.errMsg === "saveImageToPhotosAlbum:fail authorize no response") {
// 这边微信做过调整,必须要在按钮中触发,因此需要在弹框回调中进行调用
wx.showModal({
title: '提示',
content: '需要您授权保存到相册',
showCancel: false,
success: modalSuccess => {
wx.openSetting({
success(settingdata) {
console.log("settingdata", settingdata)
if (settingdata.authSetting['scope.writePhotosAlbum']) {
wx.showModal({
title: '提示',
content: '获取权限成功,再次点击即可保存',
showCancel: false,
})
} else {
wx.showModal({
title: '提示',
content: '获取权限失败,将无法保存到相册哦~',
showCancel: false,
})
}
},
fail(failData) {
console.log("failData", failData)
},
complete(finishData) {
console.log("finishData", finishData)
}
})
}
})
}
},
complete(res) {
wx.hideLoading()
}
})
}
})
},
最后别忘了在微信小程序设置项目配置downloadFile合法域名中添加下载的https域名。
三、图片文件流显示并下载
有时请求接口后端返回的图片格式不是一个完整的url,也不是其他直接能显示的图片格式,而是直接一张图片,即返回为文件流的格式。
需要对这个数据进行如下处理:
wx.request({
url: this.data.url,
responseType: 'arraybuffer', //将数据转为类似二进制数组的格式
success:res=>{
//进行转码
let url = 'data:image/png;base64,' + wx.arrayBufferToBase64(res.data)
this.setData({
imgUrl:url
})
}
})
图片途径已经转成已经base64,直接下载必然失败。
在原有图片下载的基础上,判断是否为base64,如果是则按照文件下载那样解码后下载,如果不是那么用普通下载即可。
//判断base64并下载图片
picDown() {
var save = wx.getFileSystemManager();
var number = Math.random();
//判断是否为base64
if( this.data.imgUrl.includes("base64")){
save.writeFile({
filePath: wx.env.USER_DATA_PATH + '/test' + number + '.png',
data: this.data.imgUrl.replace('data:image/png;base64,', ''),
encoding: 'base64',
success: res => {
wx.saveImageToPhotosAlbum({ //保存为png格式到相册
filePath: wx.env.USER_DATA_PATH + '/test' + number + '.png',
success: function (res) {
wx.hideLoading()
wx.showToast({
title: '保存成功',
icon: 'success',
duration: 2000, //提示的延迟时间,单位毫秒,默认:2500
})
},
fail: function (err) {
wx.hideLoading()
}
})
},
fail: err => {
console.log(err)
}
})
}else{
wx.downloadFile({
url: this.data.imgUrl,//图片的地址
success:function(res){
const tempFilePath = res.tempFilePath
wx.saveImageToPhotosAlbum({
filePath: tempFilePath, //设置下载图片的地址
success:function(){
wx.hideLoading()
wx.showToast({
title: '保存成功',
icon: 'success',
duration: 2000, //提示的延迟时间,单位毫秒,默认:2500
})
},
fail: function (err) {
wx.hideLoading()
}
})
}
})
}
},