Aktywatory Cloud Storage


Możesz aktywować funkcję w odpowiedzi na przesyłanie, aktualizowanie lub usuwanie plików i folderów w Cloud Storage.

Przykłady na tej stronie opierają się na przykładowej funkcji, która uruchamia się, gdy pliki graficzne są przesyłane do Cloud Storage. Ta przykładowa funkcja pokazuje, jak uzyskać dostęp do atrybutów zdarzeń, jak pobrać plik do instancji Cloud Functions i poznać inne podstawy obsługi zdarzeń Cloud Storage.

Więcej przykładów zastosowań znajdziesz w artykule Co mogę zrobić przy użyciu Cloud Functions?

Aktywowanie funkcji w przypadku zmian w Cloud Storage

Użyj narzędzia functions.storage, aby utworzyć funkcję, która obsługuje zdarzenia Cloud Storage. W zależności od tego, czy chcesz zawęzić zakres funkcji do określonego zasobnika Cloud Storage, czy użyć zasobnika domyślnego, użyj jednej z tych opcji:

Na przykład przykładowy generator miniaturek jest ograniczony do domyślnego zasobnika projektu:

exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => {
  // ...
});

Cloud Storage obsługuje te zdarzenia:

  • onArchive Wysyłane tylko wtedy, gdy zasobnik ma włączoną obsługę wersji obiektu. To zdarzenie wskazuje, że bieżąca wersja obiektu stała się wersją archiwalną – została zarchiwizowana albo zastąpiona przez przesłany obiekt o tej samej nazwie.
  • Wysyłane, gdy obiekt został trwale usunięty. onDelete Obejmuje to obiekty, które zostały zastąpione lub usunięte w ramach konfiguracji cyklu życia zasobnika. W przypadku zasobników z włączoną obsługą wersji obiektu nie jest wysyłane, gdy obiekt zostanie zarchiwizowany (patrz onArchive), nawet jeśli do archiwizacji nastąpi metoda storage.objects.delete.
  • onFinalize Wysyłane po utworzeniu w zasobniku nowego obiektu (lub nowej generacji istniejącego obiektu). Obejmuje to skopiowanie lub ponowne zapisanie istniejącego obiektu. Zdarzenia tego nie aktywuje nieudane przesyłanie.
  • onMetadataUpdate Wysyłane, gdy zmienią się metadane istniejącego obiektu.

Ustaw zdarzenie w module obsługi zdarzeń on w sposób podany powyżej dla onFinalize.

Dostęp do atrybutów obiektów Cloud Storage

Na potrzeby aktualizacji pliku Cloud Functions ujawnia wiele atrybutów obiektów Cloud Storage, takich jak size i contentType. Wartość atrybutu 'metageneration' zwiększa się po każdej zmianie metadanych obiektu. W przypadku nowych obiektów metageneration ma wartość 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.

Przykład generowania miniatury używa niektórych z tych atrybutów do wykrywania przypadków wyjścia, w których funkcja zwraca:

// 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.');
}

Pobieranie, przekształcanie i przesyłanie pliku

W niektórych przypadkach pobieranie plików z Cloud Storage może nie być konieczne. Jednak w przypadku wykonywania bardziej wymagających zadań, takich jak generowanie obrazu miniatury z pliku zapisanego w Cloud Storage, trzeba pobrać pliki do instancji funkcji, czyli do maszyny wirtualnej, na której uruchomiono kod.

Aby łatwo pobrać i ponownie przesłać obiekty do Cloud Storage, zainstaluj pakiet Google Cloud Storage za pomocą npm install --save @google-cloud/storage, a potem go zaimportuj. Aby korzystać z obietnic JavaScriptu do obsługi procesów zewnętrznych, takich jak zadania przetwarzania miniatur w przykładzie, zaimportuj również plik child-process-promise:

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');

Użyj polecenia gcs.bucket.file(filePath).download, aby pobrać plik do katalogu tymczasowego w instancji Cloud Functions. W tej lokalizacji możesz według potrzeb przetworzyć plik, a potem przesłać go do Cloud Storage. Podczas wykonywania zadań asynchronicznych pamiętaj, aby w wywołaniu zwrotnym zwrócić obietnicę JavaScriptu.

Przykład: przekształcenie obrazu

Korzystając z Cloud Functions w połączeniu z programami do przetwarzania obrazów, takimi jak sharp, możesz wykonywać operacje na plikach graficznych. Oto przykład tworzenia miniatury przesyłanego pliku graficznego:

// 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!");

Ten kod tworzy miniaturę 200 x 200 dla obrazu zapisanego w katalogu tymczasowym, a potem przesyła go z powrotem do Cloud Storage.

Zobacz więcej przykładów

Więcej przykładów typowych funkcji przekształcania multimediów, takich jak transkodowanie obrazów, moderowanie treści i wyodrębnianie metadanych EXIF. Pełna lista przykładów jest dostępna na GitHubie.