首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >云功能:从云存储压缩多个文档

云功能:从云存储压缩多个文档
EN

Stack Overflow用户
提问于 2018-11-22 16:35:47
回答 2查看 4K关注 0票数 4

我已经搜索了很多关于堆栈溢出的问题,但找不到合适的答案,无法从中得到我需要的答案:

我希望使用云功能从/Firebase存储中的一个文件夹中压缩多个文件。

我已经找到了从本地文件系统压缩文档的解决方案,但是无法在云存储的函数中导出如何进行压缩。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-06 03:12:28

Google支持解压缩形式的代码转换,但不支持压缩形式的转码。然而,在云存储中,任何用户都可以存储gzip压缩文件.

要使用云函数从云存储压缩多个文档,可以使用gcs.bucket.file(filePath)将文件从Cloud下载到函数实例。下载,压缩文件,并重新上传文件到云存储。在这里,您将找到一个下载、转换和上载文件的示例。您可以在这个StackOverflow 线程中找到一个压缩多个文件的示例。这个文档解释了如何使用控制台、Gsutil、代码示例或REST将对象上传到云存储。

票数 5
EN

Stack Overflow用户

发布于 2022-11-11 15:04:07

有点晚了,但我也有同样的问题要解决。

以下Firebase函数:

  1. 运行1GB/ 120秒超时(好的度量)
  2. 是由写调用触发的(只有在很少调用的情况下才执行此操作!)
  3. 忽略除background_thumbnail/以外的所有路径
  4. 创建一个随机的工作目录,然后删除它。
  5. 从Firebase存储下载图像
  6. 在文件夹中压缩这些图像:background_thumbnail/<IMAGE>
  7. 将创建的ZIP上载到Firebase存储
  8. 在Firebase存储中为ZIP文件创建一个签名URL
  9. 将签名的URL存储在Firestore中。

代码可能会被改进并变得更优雅,但是它(目前)是有效的。

代码语言:javascript
复制
const {v4: uuidv4} = require("uuid"); // for random working dir
const JSZip = require("jszip");

exports.generateThumbnailZip = functions
  .runWith({memory: "1GB", timeoutSeconds: 120})
  .region("europe-west3")
  .storage.object()
  .onFinalize(async (object) => {

  // background_thumbnail/ is the watched folder

  if (!object.name.startsWith("background_thumbnail/")) {
    return functions.logger.log(`Aborting, got: ${object.name}.`);
  }

  const jszip = new JSZip();

  const bucket = admin.storage().bucket();
  const fileDir = path.dirname(object.name);
  const workingDir = path.join(os.tmpdir(), uuidv4()); 

  const localZipPath = path.join(workingDir, `${fileDir}.zip`);
  const remoteZipPath = `${fileDir}.zip`;

  await mkdirp(workingDir);

  // -------------------------------------------------------------------
  // DOWNLOAD and ZIP
  // -------------------------------------------------------------------

  const [files] = await bucket.getFiles({prefix: `${fileDir}/`});

  for (let index = 0; index < files.length; index++) {
    const file = files[index];
    const name = path.basename(file.name);
    const tempFileName = path.join(workingDir, name);

    functions.logger.log("Downloading tmp file", tempFileName);

    await file.download({destination: tempFileName});

    jszip.folder(fileDir).file(name, fs.readFileSync(tempFileName));
  }

  const content = await jszip.generateAsync({
    type: "nodebuffer",
    compression: "DEFLATE",
    compressionOptions: { level: 9 }
  });

  functions.logger.log("Saving zip file", localZipPath);

  fs.writeFileSync(localZipPath, content);

  // -------------------------------------------------------------------
  // UPLOAD ZIP
  // -------------------------------------------------------------------

  functions.logger.log("Uploading zip to storage at", remoteZipPath);

  const uploadResponse = await bucket
    .upload(path.resolve(localZipPath), {destination: remoteZipPath});

  // -------------------------------------------------------------------
  // GET SIGNED URL FOR ZIP AND STORE IT IN DB
  // -------------------------------------------------------------------

  functions.logger.log("Getting signed URLs.");

  const signedResult = await uploadResponse[0].getSignedUrl({
    action: "read",
    expires: "03-01-2500",
  });

  const signedUrl = signedResult[0];

  functions.logger.log("Storing signed URL in db", signedUrl);

  // Stores the signed URL under "zips/<WATCHED DIR>.signedUrl"
  await db.collection("zips").doc(fileDir).set({
    signedUrl: signedUrl,
  }, {merge: true});

  // -------------------------------------------------------------------
  // CLEAN UP
  // -------------------------------------------------------------------

  functions.logger.log("Unlinking working dir", workingDir);

  fs.rmSync(workingDir, {recursive: true, force: true});

  functions.logger.log("DONE");

  return null;
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53435135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档