Déclencheurs Cloud Storage


Vous pouvez déclencher une fonction en réponse à l'importation, la mise à jour ou suppression de fichiers et de dossiers dans Cloud Storage.

Les exemples de cette page sont basés sur un exemple de fonction qui se déclenche lorsque des fichiers image sont importés dans Cloud Storage. Cet exemple de fonction montre comment accéder aux attributs d'événement, télécharger un fichier vers une instance Cloud Functions et d'autres principes de base de la gestion des événements Cloud Storage.

Pour plus d'exemples de cas d'utilisation, consultez la section Que puis-je accomplir avec Cloud Functions ?

Déclencher une fonction pour les modifications apportées à Cloud Storage

Utiliser functions.storage pour créer une fonction qui gère Cloud Storage événements. Selon que vous souhaitez étendre la portée vers un bucket Cloud Storage spécifique ou utilisez la valeur par défaut utilisez l'un des éléments suivants:

Par exemple, l'exemple du générateur de vignettes est limité au bucket par défaut pour le projet:

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

Cloud Storage accepte les événements suivants :

  • onArchive envoyé uniquement lorsque la gestion des versions des objets est activée sur un bucket. Cet événement indique que la version en ligne d'un objet a été archivée (soit à la suite d'un archivage, soit parce qu'elle a été remplacée lors de l'importation d'un objet portant le même nom).
  • onDelete Envoyée lorsqu'un objet a été définitivement supprimé. Cela inclut les objets écrasés ou supprimés dans le cadre de la configuration du cycle de vie du bucket. Pour les buckets pour lesquels la gestion des versions d'objets est activée, cet événement n'est pas envoyé lorsqu'un objet est archivé (voir onArchive), même si l'archivage s'effectue via la méthode storage.objects.delete.
  • onFinalize Envoyée lorsqu'un objet (ou une nouvelle génération d'un objet existant) est créé dans le bucket. Cela inclut la copie ou la réécriture d'un objet existant. Les échecs d'importation ne génèrent pas cet événement.
  • onMetadataUpdate : envoyé lorsque les métadonnées d'un objet existant sont modifiées.

Définissez l'événement dans le gestionnaire d'événements on, comme indiqué ci-dessus pour onFinalize.

Accéder aux attributs d'objet Cloud Storage

Cloud Functions expose un certain nombre d'attributs d'objet Cloud Storage tels que en tant que size et contentType mis à jour pour le fichier. L'attribut metageneration est incrémenté chaque fois que les métadonnées de l'objet sont modifiées. Pour les nouveaux objets, la valeur metageneration est 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.

L'exemple de génération de miniatures utilise certains de ces attributs pour détecter les cas de sortie dans lesquels la fonction renvoie :

// 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.');
}

Télécharger, transformer et importer un fichier

Dans certains cas, il n'est pas nécessaire de télécharger des fichiers depuis Cloud Storage Toutefois, pour effectuer des tâches intensives telles que la génération d'une image miniature à partir d'un fichier stocké dans Cloud Storage, vous devez télécharger des fichiers dans l'instance de fonctions, c'est-à-dire la machine virtuelle qui exécute votre code.

Pour télécharger et réimporter facilement des objets dans Cloud Storage, installez le package Google Cloud Storage à l'aide de npm install --save @google-cloud/storage, puis importez-le. Pour utiliser des promesses JavaScript pour gérer des processus externes tels que les tâches de traitement des miniatures dans l'exemple, importez également 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');

Utilisez gcs.bucket.file(filePath).download pour télécharger un fichier dans un répertoire temporaire de votre instance Cloud Functions. Dans cet emplacement, vous pouvez traiter le fichier si nécessaire, puis l'importer dans Cloud Storage. Quand ? des tâches asynchrones, assurez-vous de renvoyer une promesse JavaScript dans votre .

Exemple : transformation d'image

Utiliser Cloud Functions avec des programmes de traitement d'images tels que sharp, vous pouvez effectuer sur les fichiers image graphiques. Voici un exemple de création d'une vignette pour un fichier image importé :

// 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!");

Ce code crée une vignette de 200 x 200 pixels pour l'image enregistrée dans un répertoire temporaire, puis la réimporte dans Cloud Storage.

Découvrir d'autres exemples

Autres exemples de fonctions courantes de transformation de médias, y compris le transcodage d'images, la modération de contenu, l'extraction des métadonnées EXIF. La liste complète des exemples est disponible sur GitHub.