Sie können eine Funktion als Reaktion auf das Hochladen, Aktualisieren oder von Dateien und Ordnern in Cloud Storage werden gelöscht.
Die Beispiele auf dieser Seite basieren auf einer Beispielfunktion, die ausgelöst wird, wenn Dateien werden in Cloud Storage hochgeladen. 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
functions.storage
verwenden
um eine Funktion zu erstellen,
Cloud Storage Termine. 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 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 Ereignis-Handler on
wie oben für onFinalize
fest.
Auf Cloud Storage-Objektattribute zugreifen
Cloud Functions stellt eine Reihe von Cloud Storage-Objektattributen zur Verfügung, darunter:
als
size
und
contentType
für die aktualisierte Datei. 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 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.'); }
Datei herunterladen, umwandeln und hochladen
In einigen Fällen ist es möglicherweise nicht erforderlich, Dateien von Cloud Storage herunterzuladen. Für intensive Aufgaben wie das Generieren eines Miniaturansicht aus einer in Cloud Storage gespeicherten Datei, die Sie herunterladen müssen an die Funktionsinstanz, d. h. die virtuelle Maschine, Ihren Code.
Um Objekte einfach in Cloud Storage herunter- und wieder hochzuladen,
Google Cloud Storage
Paket mit
npm install --save @google-cloud/storage
und importieren Sie sie. So verwenden Sie JavaScript
verspricht externe Prozesse wie
die Verarbeitung von Thumbnails im
Beispiel importieren, 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');
gcs.bucket.file(filePath).download
verwenden, um eine temporäre Datei herunterzuladen
auf der Instanz Cloud Functions. Hier können Sie Folgendes tun:
die Datei nach Bedarf verarbeiten und dann in Cloud Storage hochladen. Wann?
Asynchrone Aufgaben ausführen, achten Sie darauf, dass Sie ein JavaScript-Promise in Ihrem
Callback des Nutzers an.
Beispiel: Bildtransformation
Die Verwendung von Cloud Functions in Verbindung mit Bildverarbeitungsprogrammen wie
Mit sharp
können Sie
Manipulationen an grafischen Bilddateien. 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 eine Miniaturansicht von 200 x 200 für das Bild, das in einem temporären Verzeichnis gespeichert ist, und lädt es dann hoch. Zurück zu Cloud Storage.
Weitere Beispiele
Weitere Beispiele für gängige Funktionen zur Medientransformation sind Transcodierung von Bildern, Moderation von Inhalten und Extraktion von EXIF-Metadaten. Die vollständige Liste der Beispiele finden Sie unter die auf GitHub verfügbar sind.