Sie können eine Funktion als Reaktion auf das Hochladen, Aktualisieren oder Löschen von Dateien und Ordnern in Cloud Storage auslösen.
Die Beispiele auf dieser Seite basieren auf einer Beispielfunktion, die ausgelöst wird, wenn Bilddateien in Cloud Storage hochgeladen werden. Diese Beispielfunktion zeigt, wie Sie auf Ereignisattribute zugreifen, eine Datei auf eine Cloud Functions-Instanz herunterladen und andere Grundlagen der Verarbeitung von Cloud Storage-Ereignissen.
Weitere Beispiele für Anwendungsfälle finden Sie unter Was kann ich mit Cloud Functions tun?
Funktion bei Änderungen an Cloud Storage auslösen
Verwenden Sie functions.storage
, um eine Funktion zu erstellen, die Cloud Storage-Ereignisse verarbeitet. Je nachdem, ob Sie Ihre Funktion auf einen bestimmten Cloud Storage-Bucket beschränken oder den Standard-Bucket verwenden möchten, verwenden Sie eine der folgenden Optionen:
functions.storage.object()
um auf Objektänderungen im Standard-Cloud Storage-Bucket zu warten.functions.storage.bucket('bucketName').object()
zum Überwachen von Objektänderungen in einem bestimmten Bucket.
Das Beispiel für den Miniaturansichtsgenerator ist beispielsweise auf den Standard-Bucket für das Projekt beschränkt:
exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => { // ... });
Cloud Storage unterstützt die folgenden Ereignisse:
onArchive
Wird nur gesendet, wenn für einen Bucket die Objektversionsverwaltung aktiviert ist. Dieses Ereignis bedeutet, dass die Live-Version eines Objekts zu einer archivierten Version geworden ist, weil sie entweder archiviert oder durch den Upload eines Objekts mit dem gleichen Namen überschrieben wurde.onDelete
Wird gesendet, wenn ein Objekt endgültig gelöscht wurde. Dies gilt auch für Objekte, die im Rahmen der Lebenszykluskonfiguration des Buckets überschrieben oder gelöscht werden. Für Buckets mit aktivierter Objektversionsverwaltung wird dieses Ereignis nicht gesendet, wenn ein Objekt archiviert wird (sieheonArchive
). Dies gilt auch, wenn die Archivierung über die Methodestorage.objects.delete
erfolgt.onFinalize
Wird gesendet, wenn ein neues Objekt (oder eine neue Generation eines vorhandenen Objekts) im Bucket erfolgreich erstellt wurde. Dazu gehört auch das Kopieren oder Neuschreiben eines bestehenden Objekts. Ein fehlgeschlagener Upload löst dieses Ereignis nicht aus.onMetadataUpdate
Wird gesendet, wenn sich die Metadaten eines vorhandenen Objekts ändern.
Legen Sie das Ereignis im on
-Ereignis-Handler fest, wie oben für onFinalize
gezeigt.
Auf Cloud Storage-Objektattribute zugreifen
Cloud Functions macht eine Reihe von Attributen des Cloud Storage-Objekts verfügbar, z. B. size
und contentType
für die aktualisierte Datei. Das Attribut metageneration wird immer dann erhöht, wenn sich die Metadaten des Objekts ändern. Bei neuen Objekten ist der metageneration
-Wert 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.
Im Beispiel für die Miniaturbildgenerierung werden einige dieser Attribute verwendet, um Ausstiegsszenarien zu erkennen, in denen die Funktion Folgendes zurückgibt:
// 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.'); }
Datei herunterladen, transformieren und hochladen
In einigen Fällen ist es möglicherweise nicht erforderlich, Dateien von Cloud Storage herunterzuladen. Für rechenintensive Aufgaben wie das Generieren eines Vorschaubilds aus einer in Cloud Storage gespeicherten Datei müssen Sie Dateien jedoch auf die Functions-Instanz herunterladen, also auf die virtuelle Maschine, auf der Ihr Code ausgeführt wird.
Wenn Sie Objekte einfach in Cloud Storage herunterladen und wieder hochladen möchten, installieren Sie das Google Cloud Storage-Paket mit npm install --save @google-cloud/storage
und importieren Sie es. Wenn Sie JavaScript-Promises verwenden möchten, um externe Prozesse wie die Aufgaben zur Verarbeitung von Thumbnails im Beispiel zu verarbeiten, importieren Sie auch 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');
Verwenden Sie gcs.bucket.file(filePath).download
, um eine Datei in ein temporäres Verzeichnis auf Ihrer Cloud Functions-Instanz herunterzuladen. Dort können Sie die Datei nach Bedarf verarbeiten und dann in Cloud Storage hochladen. Wenn Sie asynchrone Aufgaben ausführen, müssen Sie in Ihrem Callback ein JavaScript-Promise zurückgeben.
Beispiel: Bildtransformation
Mit Cloud Functions in Verbindung mit Bildbearbeitungsprogrammen wie sharp
können Sie grafische Bilddateien bearbeiten. Im Folgenden finden Sie ein Beispiel dafür, wie Sie eine Miniaturansicht für eine hochgeladene Bilddatei erstellen:
// 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!");
Mit diesem Code wird eine 200 × 200 px große Miniaturansicht für das Bild erstellt, das in einem temporären Verzeichnis gespeichert ist. Anschließend wird sie wieder in Cloud Storage hochgeladen.
Weitere Beispiele
Weitere Beispiele für gängige Funktionen zur Media-Transformation, darunter Bilder transkodieren, Inhalte moderieren und EXIF-Metadaten extrahieren. Die vollständige Liste der Beispiele ist auf GitHub verfügbar.