Catch up on highlights from Firebase at Google I/O 2023. Learn more

Триггеры облачного хранилища


Вы можете активировать функцию в ответ на загрузку, обновление или удаление файлов и папок в облачном хранилище.

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

Дополнительные примеры вариантов использования см. в разделе Что можно делать с облачными функциями?

Запуск функции при изменении облачного хранилища

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

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

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

Облачное хранилище поддерживает следующие события:

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

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

Доступ к атрибутам объекта Cloud Storage

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

Скачать, преобразовать и загрузить файл

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

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

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp()
const path = require('path');

//library for resizing images
const sharp = require('sharp');

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

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

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

// Download file from bucket.
const bucket = admin.storage().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, сохраненный во временном каталоге, а затем загружает его обратно в облачное хранилище.

Ознакомьтесь с другими примерами

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