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 lorsqu'une image fichiers 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 dans un 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 limiter la portée de 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'objets dans le bucket Cloud Storage par défaut.functions.storage.bucket('bucketName').object()
pour écouter les modifications d'objets sur un bucket 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 est compatible avec 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 sur lesquels la gestion des versions d'objets est activée, cet événement n'est pas envoyé lorsqu'un objet est archivé (voironArchive
), même si l'archivage s'effectue via la méthodestorage.objects.delete
.onFinalize
: envoyé lorsqu'un objet (ou une nouvelle génération d'un objet existant) est correctement 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. La
'metageneration'
est incrémenté à chaque fois que le paramètre
les 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 vignettes utilise certains de ces attributs pour détecter les sorties cas 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 vignette d'un fichier stocké dans Cloud Storage, vous devez la télécharger à l'instance Functions, 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 la
Google Cloud Storage
package avec
npm install --save @google-cloud/storage
, puis importez-la. Pour utiliser JavaScript
promet de gérer des processus externes, comme les tâches de traitement des vignettes
échantillon, 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
sur votre instance Cloud Functions. À cet endroit, vous pouvez
traiter le fichier selon les besoins, 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 la façon de
créez 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 un Vignette 200 x 200 de l'image enregistrée dans un répertoire temporaire, puis importée retour à Cloud Storage.
Découvrir d'autres exemples
Autres exemples de fonctions de transformation multimédia courantes, y compris la transcodage d'images, la modération de contenu et l'extraction de métadonnées EXIF. La liste complète des exemples est disponible sur GitHub.