Cloud Storage-Trigger


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. Diese Beispielfunktion zeigt, wie Sie auf Ereignisattribute zugreifen, eine Datei in eine Cloud Functions-Instanz herunterladen und andere Grundlagen der Verarbeitung von Cloud Storage-Ereignissen kennenlernen.

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:

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 (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 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 zur Verfügung. Das Attribut 'metageneration' wird bei jeder Änderung der Metadaten des Objekts erhöht. 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 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.');
}

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.

Installieren Sie das Paket Google Cloud Storage mit npm install --save @google-cloud/storage und importieren Sie es, um Objekte einfach in Cloud Storage herunterzuladen und wieder hochzuladen. 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. An diesem Speicherort 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 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 eine Miniaturansicht von 200 × 200 Pixel für das Bild erstellt, das in einem temporären Verzeichnis gespeichert ist, und es dann wieder in 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.