Расширьте облачное хранилище с помощью облачных функций

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

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

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

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

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

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

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

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

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

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

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

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

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

Облако функция предоставляет программу для обработки изображений под названием 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 эскиз изображения , сохраняемое во временном каталоге, а затем загружать его обратно в Cloud Storage.

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

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

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