运营近5年的小程序停用了,准备将云存储的文件下载下来,发现微信小程序开发工具不提供批量下载功能,网上找了资料,手动代码,大约需要下面几步。
1. 写云函数,获取下载地址
const CloudBase = require('@cloudbase/manager-node')
const { storage } = new CloudBase({
envId: "env-memorytools-rele-42147a", // 云开发环境ID,进入云开发的时候可以从右上角进行复制
})
// 云函数入口函数
exports.main = async (event, context) => {
const { action, params } = event
switch (action) {
// 获取云存储的所有文件信息
case 'listDirectoryFiles': {
return listDirectoryFiles(params)
}
// 获取云存储文件列表的临时下载链接
case 'getTemporaryUrl': {
return getTemporaryUrl(params)
}
}
// 获取云存储的所有文件信息
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);
}
}
这里需要注意两点:
一是,进入云函数本地文件目录(我的是batch_download_cloud_files),打开命令行工具,安装 npm 模块,命令如下:
C:\08.miniprogram\memory4\cloudfunctions\batch_download_cloud_files>npm config set registry http://registry.npm.taobao.org
C:\08.miniprogram\memory4\cloudfunctions\batch_download_cloud_files>npm install @cloudbase/manager-node
二是,上传云函数时,需要选择:创建并部署:所有文件。目的是将本地安装的 npm 模块上传到云端。
2.创建一个page,通过点击按钮事件获取文件下载地址
page.wxml
<button type="primary" bindtap="getFileUrlList">获取文件url列表</button>
page.js
getFileUrlList() {
var that = this
// 先调用获取文件列表的云函数
wx.cloud.callFunction({
name: 'batch_download_cloud_files',
data: {
action: 'listDirectoryFiles',
params: {
path: 'v4' // 这里可以使用根目录('/'),或者指定具体的目录
}
}
}).then(res => {
const { result } = res
console.log(result)
// 处理该文件列表,调用获取下载链接的云函数
return wx.cloud.callFunction({
name: 'batch_download_cloud_files',
data: {
action: 'getTemporaryUrl',
params: {
fileList: result
}
}
})
}).then(res2 => {
const { result } = res2
console.log(result)
var urlList = []
for (var i=0; i<result.length; i++) {
urlList.push(result[i].url)
console.log(result[i].url)
}
console.log(urlList)
})
},
3.下载
未找到直接下载的方法,我是将控制台打印出的下载地址复制出来,然后通过迅雷批量下载的。
4.遇到的三个问题
1)Invoking task timed out after 3 seconds
处理方法:更改云函数配置,将其超时设置调大些,如30秒
2)response size exceeded 1048576 bytes
未找到解决方法,报错的原因是云函数返回的对象或字符串太大,超过了1M。
我的处理方法是选择子目录,一个个目录获取下载地址,绕过该问题。
3)Cannot read property 'download_list' of undefined
未找到解决方法,未找到保存原因。
网友评论