Триггеры Cloud Storage (первое поколение)

Вы можете настроить запуск функции в ответ на загрузку, обновление или удаление файлов и папок в Cloud Storage.

Примеры на этой странице основаны на функции, которая активируется при загрузке файлов изображений в Cloud Storage. В этом примере функции показано, как получить доступ к атрибутам события, как скачать файл в экземпляр Cloud Functions и другие основы обработки событий Cloud Storage.

Другие примеры использования можно найти в статье Что можно делать с помощью Cloud Functions.

Как настроить триггер функции при изменении Cloud Storage

Чтобы создать функцию, которая обрабатывает события Cloud Storage, используйте functions.storage. В зависимости от того, хотите ли вы задать для функции определенную корзину Cloud Storage или использовать корзину по умолчанию, выполните одно из следующих действий:

Например, образец генератора значков ограничен ведром по умолчанию для проекта:

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

Cloud Storage поддерживает следующие события:

  • onArchive Отправляется только в том случае, если для сегмента включено управление версиями объектов. Это событие указывает, что рабочая версия объекта заархивирована, поскольку была отправлена в архив или была перезаписана из-за загрузки объекта с таким же названием.
  • onDelete – отправляется, когда объект был удален без возможности восстановления. в том числе объекты, которые перезаписываются или удаляются в соответствии с правилами жизненного цикла. Для сегментов с включенным управлением версиями объектов это значение не отправляется при архивации объекта (см. onArchive), даже если архивация выполняется с помощью метода storage.objects.delete.
  • onFinalize Отправляется, когда в сегменте успешно создан новый объект (или новое поколение существующего объекта). в том числе при копировании или перезаписи существующего объекта. Событие не инициируется в случае сбоя загрузки.
  • onMetadataUpdate Отправляется при изменении метаданных существующего объекта.

Задайте событие в обработчике событий on, как показано выше для onFinalize.

Как получить доступ к атрибутам объекта Cloud Storage

Cloud Functions предоставляет ряд атрибутов объекта Cloud Storage, таких как size и contentType, для обновленного файла. Атрибут metageneration увеличивается при каждом изменении метаданных объекта. Для новых объектов значение 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.

В примере создания эскизов некоторые из этих атрибутов используются для обнаружения случаев выхода, в которых функция возвращает:

// 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, установите пакет Google Cloud Storage с помощью npm install --save @google-cloud/storage и импортируйте его. Чтобы использовать обещания JavaScript для обработки внешних процессов, таких как задачи обработки значков в примере, также импортируйте child-process-promise:

const functions = require('firebase-functions/v1');
const { initializeApp } = require('firebase-admin/app');
const { getStorage } = require('firebase-admin/storage');
initializeApp();
const path = require('path');

//library for resizing images
const sharp = /** @type {typeof import('sharp')} */ (require('sharp'));

Используйте gcs.bucket.file(filePath).download, чтобы скачать файл во временный каталог в экземпляре Cloud Functions. Здесь вы можете обработать файл и загрузить его в Cloud Storage. При выполнении асинхронных задач убедитесь, что в обратном вызове возвращается объект Promise JavaScript.

Пример: преобразование изображений

Используя Cloud Functions вместе с программами для обработки изображений, такими как sharp, можно выполнять различные действия с графическими файлами. Ниже приведен пример того, как создать значок для загруженного файла изображения:

// Download file from bucket.
const bucket = getStorage().bucket(fileBucket);
const metadata = {
  contentType: contentType,
};
const downloadResponse = await bucket.file(filePath).download();
const imageBuffer = downloadResponse[0];
functions.logger.log("Image downloaded!");

// Generate a thumbnail using sharp.
const thumbnailBuffer = await sharp(imageBuffer).resize({
  width: 200,
  height: 200,
  withoutEnlargement: true,
}).toBuffer();
functions.logger.log("Thumbnail created");

// Upload the thumbnail with a 'thumb_' prefix.
const thumbFileName = `thumb_${fileName}`;
const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);
await bucket.file(thumbFilePath).save(thumbnailBuffer, {
  metadata: metadata,
});
return functions.logger.log("Thumbnail uploaded!");

Этот код создает уменьшенное изображение размером 200 x 200 пикселей для изображения, сохраненного во временном каталоге, а затем загружает его обратно в Cloud Storage.

Другие примеры

Другие примеры распространенных функций преобразования медиаконтента, в том числе перекодирование изображений, модерация контента и извлечение метаданных EXIF. Полный список примеров доступен на GitHub.