Cloud Storage mit Cloud Functions erweitern


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:

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 (siehe onArchive). Dies gilt auch, wenn die Archivierung über die Methode storage.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.