方法本身
下载并保存图片到相册(带频率限制)
下载并保存图片到相册(带频率限制)
/**
* 下载并保存图片到相册(带频率限制)
* @param {Array<string>} urls 图片的 URL 数组
* @param {Function} progressCallback 下载进度回调函数(可选)
* @returns {Promise<void>} 所有图片保存成功时 resolve,失败时 reject
*/
export function downloadAndSaveToAlbum(urls, progressCallback) {
return new Promise((resolve, reject) => {
if (!Array.isArray(urls) || urls.length === 0) {
reject('图片 URL 数组不能为空');
return;
}
// 检查权限
checkAndRequestAlbumPermission()
.then(() => {
console.log('开始保存图片到相册');
let completedCount = 0;
const errors = [];
const saveNext = (index) => {
if (index >= urls.length) {
if (errors.length > 0) {
reject(errors); // 有失败项
} else {
resolve(); // 全部成功
}
return;
}
const url = urls[index];
// 下载图片
uni.downloadFile({
url,
success: (res) => {
if (res.statusCode === 200) {
// 保存到相册
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: () => {
console.log(`图片 ${index + 1} 保存成功`);
completedCount++;
if (typeof progressCallback === 'function') {
progressCallback(completedCount / urls.length); // 进度回调
}
// 间隔 500 毫秒保存下一张
setTimeout(() => saveNext(index + 1), 500);
},
fail: (err) => {
console.error(`图片 ${index + 1} 保存失败:`, err);
errors.push(`图片 ${index + 1} 保存失败: ${err.errMsg}`);
setTimeout(() => saveNext(index + 1), 500);
},
});
} else {
console.error(`图片 ${index + 1} 下载失败: 状态码 ${res.statusCode}`);
errors.push(`图片 ${index + 1} 下载失败: ${res.statusCode}`);
setTimeout(() => saveNext(index + 1), 500);
}
},
fail: (err) => {
console.error(`图片 ${index + 1} 下载错误:`, err);
errors.push(`图片 ${index + 1} 下载错误: ${err.errMsg}`);
setTimeout(() => saveNext(index + 1), 500);
},
});
};
// 开始保存第一张
saveNext(0);
})
.catch((err) => {
console.error('权限请求失败:', err);
reject(err);
});
});
}
/**
* 检查并请求相册权限
* @returns {Promise<void>} 权限通过时 resolve,失败时 reject
*/
function checkAndRequestAlbumPermission() {
return new Promise((resolve, reject) => {
wx.getSetting({
success: (res) => {
if (res.authSetting['scope.writePhotosAlbum']) {
// 已授权
console.log('用户已授权保存到相册');
resolve();
} else {
// 未授权,引导用户授权
wx.showModal({
title: '提示',
content: '需要您授权保存到相册',
showCancel: false,
success: () => {
wx.openSetting({
success: (settingRes) => {
if (settingRes.authSetting['scope.writePhotosAlbum']) {
console.log('用户授权成功');
resolve();
} else {
console.error('用户未授权保存到相册');
reject('未授权保存到相册');
}
},
fail: (err) => {
console.error('打开设置失败:', err);
reject('设置打开失败');
},
});
},
});
}
},
fail: (err) => {
console.error('获取设置失败:', err);
reject('权限检测失败');
},
});
});
}
调用
imageUrls: [
'https://img1.png',
'https://img2.png',
'https://img3.png',
'https://img1.png',
],
const saveAll = () => {
console.log('保存所有二维码');
downloadAndSaveToAlbum(myData.imageUrls, (progress) => {
console.log(`下载进度: ${(progress * 100).toFixed(2)}%`);
uni.showLoading({title: `下载进度: ${(progress * 100).toFixed(2)}%`})
})
.then((paths) => {
console.log('所有图片下载成功:', paths);
uni.showToast({duration: 2000,
title: '所有图片下载成功!',
icon: 'none'
});
uni.hideLoading();
})
.catch((errors) => {
console.error('部分图片下载失败:', errors);
uni.hideLoading();
});
};