批量下载云存储中的文件
发布于 3 年前 作者 yang67 803 次浏览 来自 分享

最近开始学习使用小程序和小程序的云开发功能,遇到了文件无法批量下载的问题,以下是个人摸索学习的一些经历,在此分享一下

本次为测试环境下的一次尝试,假设小程序已经开通了云开发功能(不开如何使用云存储- -|||)

使用的是官方的云开发默认模板创建的项目,GO!

先往云存储中上传了一些文件,文件结构如下

|-- folder1
	|-- file1.txt
	|-- file2.txt
	|-- file3.txt
|-- folder2
	|-- file4.txt
	|-- file5.txt
|-- folder3
	|-- file6.txt

在’cloudfunctions’下新建一个Node.js云函数,在这里就随意了,实际可根据具体的需要来命名

进入该函数所在的目录下启动终端,运行命令

// 1.先为了保险起见
npm install
// 2.安装这个包,可参考 https://docs.cloudbase.net/api-reference/manager/node/introduction
npm install [@cloudbase](/user/cloudbase)/manager-node

安装完毕后在入口文件开始撸代码

const CloudBase = require('[@cloudbase](/user/cloudbase)/manager-node')

const {
  storage
} = new CloudBase({
  envId"xxxxxx"// 云开发环境ID,进入云开发的时候可以从右上角进行复制
});

// 获取云存储的所有文件信息
async function listDirectoryFiles(params{
  const {
    path
  } = params
    
    // 接口功能:列出文件夹下的所有文件
    // 接口声明:listDirectoryFiles(cloudPath: string): Promise<IListFileInfo[]>
  return await storage.listDirectoryFiles(path);
}

// 获取云存储文件列表的临时下载链接
async function getTemporaryUrl(params{
  const {
    fileList
  } = params
  let newFileList = fileList.filter(file => file.Size !== '0').map(file => ({
    cloudPath: file.Key,
    maxAge86400 // 临时下载链接有效时间,单位:秒
  }))

    // 接口功能:获取文件临时下载链接
    // 接口声明:getTemporaryUrl(fileList: (string | TempUrlInfo)[]):Promise<Array.<FileUrlItem>>
  return await storage.getTemporaryUrl(newFileList);
}

// 云函数入口函数
exports.main = async (event, context) => {
  const {
    functionName,
    params
  } = event
  if (functionName === 'listDirectoryFiles') {
    return await listDirectoryFiles(params)
  } else if (functionName === 'getTemporaryUrl') {
    return await getTemporaryUrl(params)
  }
}

为了调用这些代码,需要上传该云函数(或者在本地测试也可以),然后撸个测试页面

<!--pages/test/test.wxml-->
<button type="primary" bindtap="getFileUrlList">获取文件url列表</button>

// pages/test/test.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    
  },

  getFileUrlList() {
       // 先调用获取文件列表的云函数
    wx.cloud.callFunction({
      name: 'cloudManagerFunctions',
      data: {
        functionName: 'listDirectoryFiles',
        params: {
          path: '/'
        }
      }
    }).then(res => {
      const {
        result
      } = res
            // 处理该文件列表,调用获取下载链接的云函数
      return wx.cloud.callFunction({
        name: 'cloudManagerFunctions',
        data: {
          functionName: 'getTemporaryUrl',
          params: {
            fileList: result
          }
        }
      })
    }).then(res => {
      const {
        result
      } = res
      console.log(result)
    })
  },

    //......先忽略生命周期函数
})

然后点击Button触发事件,可以看到控制台打印了一条消息

好家伙,连fileId都给我了,不过有这个url其实已经可以下载了(有效期就是代码中的maxAge),具体的操作就由自己喜欢的方式来咯!在这里就不占用大家时间了

希望这篇文章能起到一点小小的作用

回到顶部