uniapp 微信小程序 下载并保存图片到相册(带频率限制)

86 阅读1分钟

方法本身

下载并保存图片到相册(带频率限制)

下载并保存图片到相册(带频率限制)
/**
 * 下载并保存图片到相册(带频率限制)
 * @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();
		  });
	};