Vous pouvez déclencher une fonction en réponse au téléchargement, à la mise à jour ou à la 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, comment télécharger un fichier sur une instance Cloud Functions et d'autres principes fondamentaux de la gestion des événements Cloud Storage.
Pour plus d'exemples de cas d'utilisation, consultez Que puis-je faire avec Cloud Functions ?
Déclencher une fonction sur les modifications de Cloud Storage
Utilisez functions.storage
pour créer une fonction qui gère les événements Cloud Storage. Selon que vous souhaitez étendre votre fonction à un bucket Cloud Storage spécifique ou utiliser le bucket par défaut, utilisez l'une des options suivantes :
-
functions.storage.object()
pour écouter les modifications d'objet sur le bucket Cloud Storage par défaut. -
functions.storage.bucket('bucketName').object()
pour écouter les modifications d'objet sur un compartiment spécifique.
Par exemple, l'exemple de générateur de vignettes est limité au bucket par défaut du projet :
exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => { // ... });
Cloud Storage accepte les événements suivants :
-
onArchive
Envoyé uniquement lorsqu'un bucket a activé la gestion des versions d'objet . Cet événement indique que la version active d'un objet est devenue une version archivée, soit parce qu'elle a été archivée, soit parce qu'elle a été écrasée par le téléchargement d'un objet du même nom. -
onDelete
Envoyé lorsqu'un objet a été définitivement supprimé. Cela inclut les objets qui sont écrasés ou supprimés dans le cadre de la configuration du cycle de vie du bucket . Pour les compartiments avec la gestion des versions d'objet activée, ceci n'est pas envoyé lorsqu'un objet est archivé (voironArchive
), même si l'archivage se produit via la méthodestorage.objects.delete
. -
onFinalize
Envoyé lorsqu'un nouvel objet (ou une nouvelle génération d'un objet existant) est créé avec succès dans le bucket. Cela inclut la copie ou la réécriture d'un objet existant. Un échec de téléchargement ne déclenche pas cet événement. -
onMetadataUpdate
Envoyé lorsque les métadonnées d'un objet existant changent.
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 size
et contentType
pour le fichier mis à jour. L'attribut 'metageneration' est incrémenté à chaque modification des métadonnées de l'objet. 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 charger un fichier
Dans certains cas, il peut ne pas être nécessaire de télécharger des fichiers depuis Cloud Storage. Cependant, 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 sur 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 npm install --save @google-cloud/storage
et importez-le. Pour utiliser les promesses JavaScript pour gérer des processus externes comme les tâches de traitement des vignettes dans l'exemple, importez également child-process-promise
:
const functions = require('firebase-functions'); 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 sur votre instance Cloud Functions. À cet emplacement, vous pouvez traiter le fichier selon vos besoins, puis l'importer dans Cloud Storage. Lorsque vous effectuez des tâches asynchrones, assurez-vous de renvoyer une promesse JavaScript dans votre rappel.
Exemple : transformation d'image
En utilisant Cloud Functions avec des programmes de traitement d'images comme sharp
, vous pouvez effectuer des manipulations sur des fichiers d'images graphiques. Voici un exemple de création d'une image miniature pour un fichier image téléchargé :
// 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 miniature 200 x 200 pour l'image enregistrée dans un répertoire temporaire, puis la réimporte dans Cloud Storage.
Explorer plus d'exemples
Plus d'exemples de fonctions courantes de transformation de médias, y compris le transcodage d'images , la modération de contenu , l'extraction de métadonnées EXIF . La liste complète des exemples est disponible sur GitHub.