【发布时间】:2021-04-19 13:36:34
【问题描述】:
如果您使用 Firebase 存储,您可能会发现无法直接从 firebase UI 或使用 gcloud UI 下载文件夹(以 zip 格式)。因此,很难为您的firebase storage 存储桶创建备份,此外,如果您使用firestore,您可以将集合导出到firebase storage。
【问题讨论】:
如果您使用 Firebase 存储,您可能会发现无法直接从 firebase UI 或使用 gcloud UI 下载文件夹(以 zip 格式)。因此,很难为您的firebase storage 存储桶创建备份,此外,如果您使用firestore,您可以将集合导出到firebase storage。
【问题讨论】:
我基于firebase-admin 和jszip 创建了一个nodejs 脚本,带有两个参数:首先下载firebase storage 中的path,其次是存储zip 文件的路径
package.json:
{
"dependencies": {
"firebase-admin": "^9.6.0",
"jszip": "^3.6.0"
}
}
index.js:
const fs = require("fs");
const JSZip = require('jszip');
const admin = require('firebase-admin');
const serviceAccount = require("./service-account-key.json");
async function main (){
try{
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
storageBucket: "stackd-56e96.appspot.com",
});
const bucket = admin.storage().bucket();
const src_storage_path = process.argv[2];
let dest_storage_path = process.argv[3];
if(dest_storage_path.includes(":"))
dest_storage_path = dest_storage_path.replace(":", "_")
const jszip = new JSZip();
const files = (await bucket.getFiles({
prefix: `${src_storage_path}/`
}))[0]
const filesContent = await Promise.all(
files.map(file => file.download())
);
filesContent.forEach((content, i) => {
jszip.file(files[i].name, content[0])
});
const content = await jszip.generateAsync({ type: 'nodebuffer' });
await fs.promises.writeFile(dest_storage_path, content)
} catch (error){
console.error(error)
}
}
main();
命令行示例:
node index.js 2021-04-16T11:47:46_54052 backup.zip
【讨论】: