调整Firebase存储中存储的所有图像的大小

yvfmudvl  于 2023-03-19  发布在  其他
关注(0)|答案(6)|浏览(163)

我已经上传了约10k的高分辨率图像的Firebase存储桶。截至目前,由于高带宽,我需要按比例缩小这些图像从桶不删除原始图像。
Firebase图像调整大小扩展功能解决了这个问题,但仅适用于那些新上传的图像。它不适用于已经上传的图像。
那么,有没有办法做到这一点。我知道我们使用云函数来调整图像的大小,但我不确定我将如何实现这一点,因为没有触发云函数的工作。

wydwbb8l

wydwbb8l1#

有一个官方的云函数sample,它展示了如何调整图像大小(它实际上与Resize Images扩展背后的云函数非常相似)。
这个示例Cloud Function在将文件上传到Firebase项目的默认Cloud Storage bucket时触发,但是应该很容易修改它的触发器。
例如,您可以编写一个callable Cloud Function,它使用Node.js Admin SDK getFiles()方法列出存储桶中的所有文件并调整每个文件的大小。
由于您有很多文件要处理,您最有可能应该通过批处理来工作,因为云函数的执行时间限制为9分钟。

pengsaosao

pengsaosao2#

这是一个快速的NodeJS函数,它将触发Firebase图像调整大小扩展。仅适用于jpg/jpeg文件。
我正在将文件复制到相同的目标。复制后重新设置以前的元数据非常重要,因为它会在复制操作中丢失。

const storage = await getStorage();
const bucketName = `${process.env.PROJECT_ID}.appspot.com`; //replace this with the bucket you want to run on
const bucket = storage.bucket(bucketName);
const files = await bucket.getFiles();
for (const file of files[0]) {
  const isImage = file.name.toLowerCase().includes('jpg') || file.name.toLowerCase().includes('jpeg');
  const isThumb = file.name.toLowerCase().includes('thumbs');
  if (isImage && !isThumb) {
    console.info(`Copying ${file.name}`);
    const metadata = await file.getMetadata();
    await file.copy(file.name);
    await file.setMetadata(metadata[0]);
  }
}
ubby3x7f

ubby3x7f3#

如果您的内容已经上传到云存储桶,则无需部署任何类型的云函数或简单代码来自动完成所有这些操作。云函数仅响应桶内发生的事件,如对象的创建或删除。
最后你要做的是写一些代码到list all your objects,然后对每个download it在本地修改,然后upload修改后的版本回到bucket。这可能会很长,取决于你有多少内容。如果你只想做一次,你最好只写一个脚本并在Cloud Shell中运行它。这样就可以最大限度地减少传输对象所花费的时间。

5sxhfpxr

5sxhfpxr4#

或者,您可以创建一个Google Cloud Function(URL端点),用于获取将在运行时调整大小并缓存到GCS和CDN的图像。例如:
https://i.kriasoft.com/sample.jpg-原始图像https://i.kriasoft.com/w_200,h_100/sample.jpg-动态调整大小的图像

$ npm install image-resizing --save
const { createHandler } = require("image-resizing");

module.exports.img = createHandler({
  // Where the source images are located.
  // E.g. gs://s.example.com/image.jpg
  sourceBucket: "s.example.com",

  // Where the transformed images need to be stored.
  // E.g. gs://c.example.com/image__w_80,h_60.jpg
  cacheBucket: "c.example.com",
});

https://github.com/kriasoft/image-resizing

lskq00tm

lskq00tm5#

Firebase图像大小调整扩展在事件**“google.storage.object.finalize”**上触发。
正如gcp文档所述:
在存储桶中创建新对象(或覆盖现有对象,然后创建新一代的该对象)时发送此事件
对于被覆盖的对象,我们需要创建同名的该对象的副本,为了完成此操作,我们可以使用Node.js Admin SDK,方法是getFiles(),谢谢Renaud Tarnec,然后file.copy()

const { Storage } = require("@google-cloud/storage");
const storage = new Storage();

// Don't forget to replace with your bucket name
const bucket = storage.bucket("bucket-name.appspot.com"); 

const triggerBucketEvent = async () => {
  bucket.getFiles(
    {
      prefix: "public", // you can add a path prefix
      autoPaginate: false,
    },
    async (err, files) => {
      // Copy each file on same directory with the same name
      await Promise.all(files.map((file) => file.copy(file.metadata.name)));
    }
  );
};

triggerBucketEvent();

相关问题