Вы можете активировать функцию в ответ на загрузку, обновление или удаление файлов и папок в облачном хранилище.
Примеры на этой странице основаны на примере функции, которая срабатывает при загрузке файлов изображений в облачное хранилище. В этом примере функции показано, как получить доступ к атрибутам событий, как загрузить файл в экземпляр Cloud Functions, а также другие основы обработки событий Cloud Storage.
Дополнительные примеры вариантов использования см. в разделе Что можно делать с облачными функциями?
Запуск функции при изменении облачного хранилища
Используйте functions.storage
для создания функции, которая обрабатывает события облачного хранилища. В зависимости от того, хотите ли вы ограничить свою функцию определенной корзиной Cloud Storage или использовать корзину по умолчанию, используйте один из следующих способов:
-
functions.storage.object()
для прослушивания изменений объектов в корзине Cloud Storage по умолчанию. -
functions.storage.bucket('bucketName').object()
для прослушивания изменений объекта в определенном сегменте.
Например, образец генератора эскизов привязан к корзине по умолчанию для проекта:
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.