在Firebase存储中解压缩文件

时间:2017-02-19 05:04:58

标签: firebase firebase-storage

我目前正在学习Firebase。

我要求从HTML中将文件(.zip)成功传输到firebase存储桶。

我的问题是,在firebase存储服务器上传完成后是否可以解压缩文件。

我可以使用PHP来做到这一点,我只是想知道在没有任何服务器代码的情况下使用Firebase是否可行。

3 个答案:

答案 0 :(得分:0)

不,您从客户端上传的文件将存储为存储桶中的完全相同的文件。目前没有办法在上传文件后自动更改该文件。

答案 1 :(得分:0)

我相信您可以通过利用云功能来实现。 您可以为路径编写存储触发器,并且一旦上传了zip文件,它就会触发云功能,该功能会将文件解压缩到所需的位置。为了节省空间,您还可以在解压缩后删除该zip文件。

答案 2 :(得分:-1)

有一种方法可以通过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的简短教程。