获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

云存储触发器

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

您可以触发一个函数来响应云存储中文件和文件夹的上传、更新或删除。

本页中的示例基于图像文件上传到 Cloud Storage 时触发的示例函数。此示例函数演示了如何访问事件属性、如何将文件下载到 Cloud Functions 实例以及处理 Cloud Storage 事件的其他基础知识。

有关用例的更多示例,请参阅我可以使用 Cloud Functions 做什么?

在 Cloud Storage 更改时触发函数

使用functions.storage创建一个处理 Cloud Storage 事件的函数。根据您是要将函数的范围限定为特定的 Cloud Storage 存储分区还是使用默认存储分区,请使用以下选项之一:

例如,缩略图生成器示例的范围为项目的默认存储桶:

exports.generateThumbnail = functions.storage.object().onFinalize(async (object) => {
  // ...
});

Cloud Storage 支持以下事件:

  • onArchive仅在存储桶启用对象版本控制时发送。此事件表示对象的实时版本已成为存档版本,因为它已被存档,或者因为它被同名对象的上传覆盖。
  • onDelete当对象被永久删除时发送。这包括作为存储桶生命周期配置的一部分被覆盖或删除的对象。对于启用了对象版本控制的存储桶,归档对象时不会发送此消息(请参阅onArchive ),即使通过storage.objects.delete方法进行归档也是如此。
  • onFinalize在桶中成功创建新对象(或现有对象的新一代)时发送。这包括复制或重写现有对象。上传失败不会触发此事件。
  • onMetadataUpdate在现有对象的元数据更改时发送。

如上所示onFinalizeon事件处理程序中设置事件。

访问 Cloud Storage 对象属性

Cloud Functions 公开了许多 Clo​​ud Storage 对象属性,例如更新文件的sizecontentType 。每当对象的元数据发生更改时, “元生成”属性就会增加。对于新对象, metageneration生成值为1

const fileBucket = object.bucket; // The Storage bucket that contains the file.
const filePath = object.name; // File path in the bucket.
const contentType = object.contentType; // File content type.
const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.

缩略图生成示例使用其中一些属性来检测函数返回的退出情况:

// Exit if this is triggered on a file that is not an image.
if (!contentType.startsWith('image/')) {
  return functions.logger.log('This is not an image.');
}

// Get the file name.
const fileName = path.basename(filePath);
// Exit if the image is already a thumbnail.
if (fileName.startsWith('thumb_')) {
  return functions.logger.log('Already a Thumbnail.');
}

下载、转换和上传文件

在某些情况下,可能不需要从 Cloud Storage 下载文件。但是,要执行密集型任务,例如从存储在 Cloud Storage 中的文件生成缩略图,您需要将文件下载到函数实例,即运行代码的虚拟机。

要轻松下载对象并将其重新上传到 Cloud Storage,请使用npm install --save @google-cloud/storage安装Google Cloud Storage 包,然后将其导入。要使用 JavaScript Promise 处理示例中的缩略图处理任务等外部进程,还需要导入child-process-promise

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp()
const spawn = require('child-process-promise').spawn;
const path = require('path');
const os = require('os');
const fs = require('fs');

使用gcs.bucket.file(filePath).download将文件下载到 Cloud Functions 实例上的临时目录。在此位置,您可以根据需要处理文件,然后上传到 Cloud Storage。执行异步任务时,请确保在回调中返回 JavaScript 承诺。

示例:图像转换

Cloud Functions 提供了一个名为ImageMagick的图像处理程序,可以对图形图像文件执行操作。以下是如何为上传的图像文件创建缩略图的示例:

// Download file from bucket.
const bucket = admin.storage().bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
const metadata = {
  contentType: contentType,
};
await bucket.file(filePath).download({destination: tempFilePath});
functions.logger.log('Image downloaded locally to', tempFilePath);
// Generate a thumbnail using ImageMagick.
await spawn('convert', [tempFilePath, '-thumbnail', '200x200>', tempFilePath]);
functions.logger.log('Thumbnail created at', tempFilePath);
// We add a 'thumb_' prefix to thumbnails file name. That's where we'll upload the thumbnail.
const thumbFileName = `thumb_${fileName}`;
const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);
// Uploading the thumbnail.
await bucket.upload(tempFilePath, {
  destination: thumbFilePath,
  metadata: metadata,
});
// Once the thumbnail has been uploaded delete the local file to free up disk space.
return fs.unlinkSync(tempFilePath);

此代码执行ImageMagick命令行程序convert为保存在临时目录中的图像创建 200x200 缩略图,然后将其上传回 Cloud Storage。

探索更多示例

更多常见媒体转换功能的示例,包括图像转码内容审核EXIF 元数据提取。 GitHub 上提供了完整的示例列表

有关详细信息,请参阅完整的 Google Cloud Storage 触发器文档