评论

批量下载云存储中的文件

在使用云开发功能中,有很多上传到云存储中的文件想要再下载回本地,结果发现只能右键一个一个下载,没有实现批量下载的功能。然而最近无意中发现一个文档可以实现,特来分享一下

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

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

使用的是官方的云开发默认模板创建的项目,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/manager-node


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

const CloudBase = require('@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),具体的操作就由自己喜欢的方式来咯!在这里就不占用大家时间了

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


最后一次编辑于  2022-02-10  
点赞 4
收藏
评论

5 个评论

  • 神经蛙
    神经蛙
    10-14

    更新:22年后已不再使用云开发

    10-14
    赞同
    回复
  • TT
    TT
    04-22
    1. 每次打印fileIdList中只能打印出一张图片fileIdList: Array(1)
    2. 0"cloud://horimed-env-2ga7n6hh5e4a67af.686f-horimed-env-2ga7n6hh5e4a67af-1320915286/Image/t1_1713232783000_0.png"
    3. length1
    4. nv_length: (...)
    5. __proto__: Array(0)
    6. __proto__: Object


    请问是什么原因?


    04-22
    赞同
    回复
  • 喜之郎果冻
    喜之郎果冻
    2022-10-17

    errMsg: FunctionName parameter could not be found

    2022-10-17
    赞同
    回复
  • myccmj(cmj)
    myccmj(cmj)
    2022-10-15

    nice,帮了大忙了

    2022-10-15
    赞同
    回复
  • Cai.
    Cai.
    2022-07-22

    感谢!帮助到我了

    2022-07-22
    赞同
    回复
登录 后发表内容