如果您的内容已经上传到云存储桶,则无需部署任何类型的云函数或简单代码来自动完成所有这些操作。云函数仅响应桶内发生的事件,如对象的创建或删除。 最后你要做的是写一些代码到list all your objects,然后对每个download it在本地修改,然后upload修改后的版本回到bucket。这可能会很长,取决于你有多少内容。如果你只想做一次,你最好只写一个脚本并在Cloud Shell中运行它。这样就可以最大限度地减少传输对象所花费的时间。
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",
});
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();
6条答案
按热度按时间wydwbb8l1#
有一个官方的云函数sample,它展示了如何调整图像大小(它实际上与Resize Images扩展背后的云函数非常相似)。
这个示例Cloud Function在将文件上传到Firebase项目的默认Cloud Storage bucket时触发,但是应该很容易修改它的触发器。
例如,您可以编写一个callable Cloud Function,它使用Node.js Admin SDK
getFiles()
方法列出存储桶中的所有文件并调整每个文件的大小。由于您有很多文件要处理,您最有可能应该通过批处理来工作,因为云函数的执行时间限制为9分钟。
pengsaosao2#
这是一个快速的NodeJS函数,它将触发Firebase图像调整大小扩展。仅适用于jpg/jpeg文件。
我正在将文件复制到相同的目标。复制后重新设置以前的元数据非常重要,因为它会在复制操作中丢失。
ubby3x7f3#
如果您的内容已经上传到云存储桶,则无需部署任何类型的云函数或简单代码来自动完成所有这些操作。云函数仅响应桶内发生的事件,如对象的创建或删除。
最后你要做的是写一些代码到list all your objects,然后对每个download it在本地修改,然后upload修改后的版本回到bucket。这可能会很长,取决于你有多少内容。如果你只想做一次,你最好只写一个脚本并在Cloud Shell中运行它。这样就可以最大限度地减少传输对象所花费的时间。
5sxhfpxr4#
或者,您可以创建一个Google Cloud Function(URL端点),用于获取将在运行时调整大小并缓存到GCS和CDN的图像。例如:
https://i.kriasoft.com/sample.jpg
-原始图像https://i.kriasoft.com/w_200,h_100/sample.jpg
-动态调整大小的图像https://github.com/kriasoft/image-resizing
lskq00tm5#
Firebase图像大小调整扩展在事件**“google.storage.object.finalize”**上触发。
正如gcp文档所述:
在存储桶中创建新对象(或覆盖现有对象,然后创建新一代的该对象)时发送此事件
对于被覆盖的对象,我们需要创建同名的该对象的副本,为了完成此操作,我们可以使用Node.js Admin SDK,方法是getFiles(),谢谢Renaud Tarnec,然后file.copy()
3yhwsihp6#
firebase resize扩展将自动为您执行此操作:
https://firebase.google.com/products/extensions/firebase-storage-resize-images