Sie können eine Funktion auslösen, wenn Dateien und Ordner in Cloud Storage hochgeladen, aktualisiert oder gelöscht werden.
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 Änderungen an Cloud Storage 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()
, um auf Objektänderungen im Standard-Cloud Storage-Bucket zu warten.functions.storage.bucket('bucketName').object()
, um auf Objektänderungen in einem bestimmten Bucket zu warten.
Im Beispiel für den Miniaturansichtsgenerator ist der Standard-Bucket für das Projekt festgelegt:
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. 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 Ereignis-Handler on
wie oben für onFinalize
fest.
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 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 Erstellung von Miniaturansichten werden einige dieser Attribute verwendet, um Ausstiegsfä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.'); }
Dateien herunterladen, transformieren 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
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.