Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

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

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

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

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

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

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

exports.generateThumbnail = 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.
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.');
}

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

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

Чтобы легко загружать и повторно загружать объекты в облачное хранилище, установите пакет 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 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. В этом месте вы можете обработать файл по мере необходимости, а затем загрузить его в облачное хранилище. При выполнении асинхронных задач убедитесь, что вы возвращаете обещание 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 для изображения, сохраненного во временном каталоге, а затем загружает его обратно в облачное хранилище.

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

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

Дополнительную информацию см. в полной документации по триггерам Google Cloud Storage.