【问题标题】:Unzip file at Firebase storage在 Firebase 存储中解压缩文件
【发布时间】:2017-02-19 05:04:57
【问题描述】:

我目前正在学习 Firebase。

我有一个要求,我可以从 HTML 将文件(.zip)成功传输到 firebase 存储桶。

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

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

【问题讨论】:

    标签: firebase firebase-storage


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-28
          • 2021-10-02
          • 1970-01-01
          • 1970-01-01
          • 2022-12-21
          • 2020-08-11
          相关资源
          最近更新 更多