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. In dieser Beispielfunktion wird gezeigt, wie Sie auf Ereignisattribute zugreifen, eine Datei in eine Cloud Functions-Instanz herunterladen und wie Sie Cloud Storage-Ereignisse allgemein verarbeiten.
Weitere Beispiele für Anwendungsfälle finden Sie unter Was kann ich mit Cloud Functions tun?
Funktion bei Cloud Storage-Änderungen auslösen
Verwenden Sie functions.storage
, um eine Funktion zu erstellen, die Cloud Storage-Ereignisse verarbeitet. Je nachdem, ob Sie die 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()
zum Überwachen von Objektänderungen im standardmäßigen Cloud Storage-Bucket.functions.storage.bucket('bucketName').object()
, um auf Objektänderungen in einem bestimmten Bucket zu warten.
Das Beispiel für den Generator für Miniaturansichten bezieht sich beispielsweise auf den Standard-Bucket des Projekts:
exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => { // ... });
Cloud Storage unterstützt diese 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. Bei 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
-Event-Handler fest, wie oben für onFinalize
gezeigt.
Auf Cloud Storage-Objektattribute zugreifen
Cloud Functions stellt eine Reihe von Cloud Storage-Objektattributen wie size
und contentType
für die aktualisierte Datei bereit. Das Attribut metageneration wird jedes Mal erhöht, wenn sich die Metadaten des Objekts ändern. Bei neuen Objekten lautet 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 zum Generieren von Miniaturansichten werden einige dieser Attribute verwendet, um Exit-Fälle zu erkennen, bei 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, umwandeln und hochladen
In einigen Fällen ist es möglicherweise nicht erforderlich, Dateien von Cloud Storage herunterzuladen. Wenn Sie jedoch intensive Aufgaben ausführen möchten, z. B. ein Miniaturbild aus einer in Cloud Storage gespeicherten Datei generieren, müssen Sie Dateien auf die Funktionsinstanz herunterladen, also auf die virtuelle Maschine, auf der Ihr Code ausgeführt wird.
Wenn Sie Objekte ganz einfach herunterladen und noch einmal in Cloud Storage hochladen möchten, installieren Sie das Google Cloud Storage-Paket mit npm install --save @google-cloud/storage
und importieren Sie es. Wenn du JavaScript-Versprechen zum Verwalten externer Prozesse wie der Miniaturansichtenverarbeitung in der Beispieldatei verwenden möchtest, musst du auch child-process-promise
importieren:
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 bei Bedarf bearbeiten und dann auf 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 und Bildverarbeitungsprogrammen wie sharp
können Sie grafische Bilddateien bearbeiten. Im Folgenden findest du ein Beispiel für die Erstellung eines Thumbnails für eine hochgeladene Bilddatei:
// 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 ein 200 × 200 Pixel großes Thumbnail für das Bild erstellt, das in einem temporären Verzeichnis gespeichert wird. Anschließend wird es wieder auf Cloud Storage hochgeladen.
Weitere Beispiele ansehen
Weitere Beispiele für gängige Funktionen zur Medientransformation sind Transcodierung von Bildern, Moderation von Inhalten und Extraktion von EXIF-Metadaten. Eine vollständige Liste der Beispiele finden Sie auf GitHub.