Триггеры облачного хранилища (1-го поколения)

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

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

Дополнительные примеры использования см. в разделе «Что я могу делать с Cloud Functions ?».

Запуск функции при изменении параметров Cloud Storage

Используйте functions.storage для создания функции, обрабатывающей события Cloud 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.');
}

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

For some cases, it may not be necessary to download files from Cloud Storage . However, to perform intensive tasks such as generating a thumbnail image from a file stored in Cloud Storage , you need to download files to the functions instance—that is, the virtual machine that runs your code.

To easily download and re-upload objects to Cloud Storage , install the Google Cloud Storage package using npm install --save @google-cloud/storage , and import it. To use JavaScript promises to handle external processes like the thumbnail processing tasks in the sample, also import child-process-promise :

const functions = require('firebase-functions/v1');
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 . В этом месте вы можете обработать файл по мере необходимости, а затем загрузить его в Cloud Storage . При выполнении асинхронных задач убедитесь, что вы возвращаете промис JavaScript в функции обратного вызова.

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

Используя Cloud Functions в сочетании с программами обработки изображений, такими как 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!");

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

Изучите другие примеры

More examples of common media transformation functions including transcoding images , moderating content , extracting EXIF metadata . The full list of examples is available on GitHub.