【发布时间】:2017-02-19 05:04:57
【问题描述】:
我目前正在学习 Firebase。
我有一个要求,我可以从 HTML 将文件(.zip)成功传输到 firebase 存储桶。
我的问题,在firebase存储服务器上传完成后是否可以解压缩文件。
我可以使用 PHP 做到这一点,我只是想知道是否可以在没有任何服务器代码的情况下使用 Firebase。
【问题讨论】:
我目前正在学习 Firebase。
我有一个要求,我可以从 HTML 将文件(.zip)成功传输到 firebase 存储桶。
我的问题,在firebase存储服务器上传完成后是否可以解压缩文件。
我可以使用 PHP 做到这一点,我只是想知道是否可以在没有任何服务器代码的情况下使用 Firebase。
【问题讨论】:
我相信您可以通过利用云功能来实现它。 您可以为路径编写存储触发器,上传 zip 文件后,它会触发云功能,将文件解压缩到您想要的位置。为了节省空间,您还可以在解压缩后删除 zip 文件。
【讨论】:
不,您从客户端上传的文件将作为完全相同的文件存储在您的存储桶中。目前没有办法在上传后自动更改该存储文件。
【讨论】:
有一种方法可以使用 FirebaseFunctions 来执行它。我们可以修改Aeyrium's answer to this Stack Overflow question中的代码来满足我们的需求,如下:
const functions = require('firebase-functions');
const admin = require("firebase-admin");
const path = require('path');
const fs = require('fs');
const os = require('os');
const unzip = require('unzipper')
var serviceAccount = require("./serviceAccountKey.json");
const firebaseConfig = {
apiKey: "*",
authDomain: "*",
databaseURL: "*.firebaseio.com",
projectId: "*",
storageBucket: "p*.appspot.com",
messagingSenderId: "*",
appId: "*",
measurementId: "*",
credential: admin.credential.cert(serviceAccount)
};
admin.initializeApp(firebaseConfig);
const storage = admin.storage();
const runtimeOpts = {
timeoutSeconds: 540,
memory: '256MB'
}
exports.unzip = functions.runWith(runtimeOpts).storage.object().onFinalize((object) => {
return new Promise((resolve, reject) => {
//console.log("objct is:",object)
if (object.contentType !== 'application/x-zip') {
reject();
} else {
//const bucket = admin.storage.bucket(object.bucket)
const bucket = admin.storage().bucket()
const remoteFile = bucket.file(object.name)
const remoteDir = object.name.replace('.zip', '')
console.log(`Downloading ${remoteFile}`)
remoteFile.createReadStream()
.on('error', err => {
console.error(err)
reject(err);
})
.on('response', response => {
// Server connected and responded with the specified status and headers.
//console.log(response)
})
.on('end', () => {
// The file is fully downloaded.
console.log("Finished downloading.")
resolve();
})
.pipe(unzip.Parse())
.on('entry', entry => {
const file = bucket.file(`${remoteDir}/${entry.path}`)
entry.pipe(file.createWriteStream())
.on('error', err => {
console.log(err)
reject(err);
})
.on('finish', () => {
console.log(`Finsihed extracting ${remoteDir}/${entry.path}`)
});
//entry.autodrain();
});
}
})
});
此外,TypeScript 中有一个关于 here 的简短教程。
【讨论】: