最近开始学习使用小程序和小程序的云开发功能,遇到了文件无法批量下载的问题,以下是个人摸索学习的一些经历,在此分享一下
本次为测试环境下的一次尝试,假设小程序已经开通了云开发功能(不开如何使用云存储- -|||)
使用的是官方的云开发默认模板创建的项目,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,
maxAge: 86400 // 临时下载链接有效时间,单位:秒
}))
// 接口功能:获取文件临时下载链接
// 接口声明: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),具体的操作就由自己喜欢的方式来咯!在这里就不占用大家时间了
希望这篇文章能起到一点小小的作用
更新:22年后已不再使用云开发
请问是什么原因?
errMsg: FunctionName parameter could not be found
nice,帮了大忙了
感谢!帮助到我了