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