Aktywatory Cloud Storage

.

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

Przykłady na tej stronie są oparte na przykładowej funkcji, która jest wywoływana, gdy pliki obrazów są przesyłane do Cloud Storage. Ta przykładowa funkcja pokazuje, jak uzyskać dostęp do atrybutów zdarzeń, jak pobrać plik do Cloud Functions oraz inne podstawy obsługi zdarzeń Cloud Storage.

Zaimportuj wymagane moduły

Zacznij od zaimportowania modułu wymaganego do obsługi Cloud Storage wydarzenia:

Node.js

 const {onObjectFinalized} = require("firebase-functions/v2/storage");

Python

 from firebase_functions import storage_fn

Aby utworzyć pełny przykład, dodaj też zależności dla narzędzi Firebase Admin SDK i przetwarzania obrazu:

Node.js

 const {initializeApp} = require("firebase-admin/app");
const {getStorage} = require("firebase-admin/storage");
const logger = require("firebase-functions/logger");
const path = require("path");

// library for image resizing
const sharp = require("sharp");

initializeApp();

Python

 import io
import pathlib

from PIL import Image

from firebase_admin import initialize_app

initialize_app()
from firebase_admin import storage

Zakres funkcji Cloud Storage

Użyj poniższego wzorca, aby określić zakres wybierz konkretny zasobnik Cloud Storage i ustaw odpowiednie opcje:

Node.js

// scope handler to a specific bucket, using storage options parameter
export archivedopts = onObjectArchived({ bucket: "myBucket" }, (event) => {
  //…
});

Python

# Scope handler to a specific bucket using storage options parameter
@storage_fn.on_object_archived(bucket="myBucket")
def archived_bucket(event: storage_fn.CloudEvent[storage_fn.StorageObjectData]):
    # ...

Z kolei przykładowa funkcja generatora miniatur jest ograniczona do domyślnego zasobnika w projekcie:

Node.js

exports.generateThumbnail = onObjectFinalized({cpu: 2}, async (event) => {
// ...
});

Python

@storage_fn.on_object_archived()
def generatethumbnail(event: storage_fn.CloudEvent[storage_fn.StorageObjectData]):
    # ...

Ustaw lokalizację funkcji

Niezgodność między może spowodować błąd wdrożenia. oraz odległość od lokalizacji. zasobnika Cloud Storage i lokalizacja funkcji mogą mieć znaczący wpływ opóźnienia w sieci. Aby uniknąć takich sytuacji, podaj lokalizacja funkcji tak, pasuje do lokalizacji zasobnika/reguły na jeden z tych sposobów:

  • Lokalizacja funkcji jest taka sama jak lokalizacja reguły
  • Lokalizacja funkcji znajduje się w lokalizacji aktywatora (gdy region aktywatora to podwójny/wieloregionalny)
  • Funkcja może być w dowolnej lokalizacji, jeśli region aktywatora jest ustawiony na us-central1

Obsługuj zdarzenia Cloud Storage

Dostępne są te moduły obsługi zdarzeń Cloud Storage:

Node.js

  • onObjectArchived Wysyłane tylko wtedy, gdy w zasobniku jest włączona obsługa wersji obiektów. To zdarzenie wskazuje, że aktywna wersja obiektu została przekształcona w zarchiwizowana, ponieważ została zarchiwizowana zastąpione przez przesłanie obiektu o tej samej nazwie.
  • Wysyłane, gdy obiekt został trwale usunięty. onObjectDeleted Ten zawiera obiekty, które zostały zastąpione lub usunięte w ramach konfiguracji cyklu życia. Do zasobników zawierających obsługa wersji obiektu włączony, nie jest wysyłany, gdy obiekt zostanie zarchiwizowany (patrz onArchive), nawet jeśli archiwizacja następuje za pomocą metody storage.objects.delete.
  • onObjectFinalized Wysyłane, gdy nowy obiekt (lub nowa generacja obiektu istniejący obiekt) został utworzony w zasobniku. Obejmuje to kopiowanie lub zmianę zapisu istniejącego obiektu. Zdarzenia tego nie aktywuje nieudane przesyłanie.
  • onMetadataUpdated Wysyłane, gdy zmienią się metadane istniejącego obiektu.

Python

  • on_object_archived Wysyłane tylko wtedy, gdy w zasobniku jest włączona obsługa wersji obiektów. 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.
  • on_object_deleted Wysyłane po nieodwracalnym usunięciu obiektu. Dotyczy to obiektów, 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 obiektów nie jest wysyłane, gdy obiekt zostanie zarchiwizowany (patrz onArchive), nawet jeśli archiwizacja nastąpiła za pomocą metody storage.objects.delete.
  • on_object_finalized Wysyłane po utworzeniu w zasobniku nowego obiektu (lub nowej generacji istniejącego obiektu). Obejmuje to kopiowanie lub zmianę zapisu istniejącego obiektu. Zdarzenia tego nie aktywuje nieudane przesyłanie.
  • on_metadata_updated Wysyłane po zmianie metadanych istniejącego obiektu.

Dostęp do atrybutów obiektu Cloud Storage

Cloud Functions udostępnia kilka atrybutów obiektu Cloud Storage, takich jak rozmiar obiektu i typ treści zaktualizowanego pliku. Atrybut metageneration zwiększa się za każdym razem, gdy nastąpi zmiana metadanych obiektu. W przypadku nowych obiektów wartość metageneration to 1.

Node.js

const fileBucket = event.data.bucket; // Storage bucket containing the file.
const filePath = event.data.name; // File path in the bucket.
const contentType = event.data.contentType; // File content type.

Python

bucket_name = event.data.bucket
file_path = pathlib.PurePath(event.data.name)
content_type = event.data.content_type

Przykład generowania miniatur korzysta z tych atrybutów, aby wykrywać przypadki wyjścia, w których funkcja zwraca:

Node.js

// Exit if this is triggered on a file that is not an image.
if (!contentType.startsWith("image/")) {
  return logger.log("This is not an image.");
}
// Exit if the image is already a thumbnail.
const fileName = path.basename(filePath);
if (fileName.startsWith("thumb_")) {
  return logger.log("Already a Thumbnail.");
}

Python

# Exit if this is triggered on a file that is not an image.
if not content_type or not content_type.startswith("image/"):
    print(f"This is not an image. ({content_type})")
    return

# Exit if the image is already a thumbnail.
if file_path.name.startswith("thumb_"):
    print("Already a thumbnail.")
    return

Pobieranie, przekształcanie i przesyłanie pliku

W niektórych przypadkach pobieranie plików z usługi Cloud Storage Jednak do wykonania intensywnych zadań, takich jak generowanie obraz miniatury z pliku zapisanego w usłudze Cloud Storage, musisz pobrać do instancji funkcji, czyli uruchomionej maszyny wirtualnej. kod.

Używanie Cloud Functions razem z programami do przetwarzania obrazu, takimi jak sharp na potrzeby Node.js i Pillow w języku Python, możesz wykonać manipulowania plikami graficznymi. Oto przykład tego, jak utwórz miniaturę dla przesłanego pliku obrazu:

Node.js

/**
 * When an image is uploaded in the Storage bucket,
 * generate a thumbnail automatically using sharp.
 */
exports.generateThumbnail = onObjectFinalized({cpu: 2}, async (event) => {

  const fileBucket = event.data.bucket; // Storage bucket containing the file.
  const filePath = event.data.name; // File path in the bucket.
  const contentType = event.data.contentType; // File content type.

  // Exit if this is triggered on a file that is not an image.
  if (!contentType.startsWith("image/")) {
    return logger.log("This is not an image.");
  }
  // Exit if the image is already a thumbnail.
  const fileName = path.basename(filePath);
  if (fileName.startsWith("thumb_")) {
    return logger.log("Already a Thumbnail.");
  }

  // Download file into memory from bucket.
  const bucket = getStorage().bucket(fileBucket);
  const downloadResponse = await bucket.file(filePath).download();
  const imageBuffer = downloadResponse[0];
  logger.log("Image downloaded!");

  // Generate a thumbnail using sharp.
  const thumbnailBuffer = await sharp(imageBuffer).resize({
    width: 200,
    height: 200,
    withoutEnlargement: true,
  }).toBuffer();
  logger.log("Thumbnail created");

  // Prefix 'thumb_' to file name.
  const thumbFileName = `thumb_${fileName}`;
  const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);

  // Upload the thumbnail.
  const metadata = {contentType: contentType};
  await bucket.file(thumbFilePath).save(thumbnailBuffer, {
    metadata: metadata,
  });
  return logger.log("Thumbnail uploaded!");
});

Pobierz plik do tymczasowego katalogu na instancji Cloud Functions. W tym miejscu możesz przetworzyć plik zgodnie z potrzebami, a następnie przesłać go do Cloud Storage. Podczas wykonywania zadań asynchronicznych zwracaj obietnicę JavaScriptu w funkcji wywołania zwrotnego.

Python

@storage_fn.on_object_finalized()
def generatethumbnail(event: storage_fn.CloudEvent[storage_fn.StorageObjectData]):
    """When an image is uploaded in the Storage bucket, generate a thumbnail
    automatically using Pillow."""

    bucket_name = event.data.bucket
    file_path = pathlib.PurePath(event.data.name)
    content_type = event.data.content_type

    # Exit if this is triggered on a file that is not an image.
    if not content_type or not content_type.startswith("image/"):
        print(f"This is not an image. ({content_type})")
        return

    # Exit if the image is already a thumbnail.
    if file_path.name.startswith("thumb_"):
        print("Already a thumbnail.")
        return

    bucket = storage.bucket(bucket_name)

    image_blob = bucket.blob(str(file_path))
    image_bytes = image_blob.download_as_bytes()
    image = Image.open(io.BytesIO(image_bytes))

    image.thumbnail((200, 200))
    thumbnail_io = io.BytesIO()
    image.save(thumbnail_io, format="png")
    thumbnail_path = file_path.parent / pathlib.PurePath(f"thumb_{file_path.stem}.png")
    thumbnail_blob = bucket.blob(str(thumbnail_path))
    thumbnail_blob.upload_from_string(thumbnail_io.getvalue(), content_type="image/png")

Ten kod tworzy Miniatura obrazu 200 x 200 zapisanego w katalogu tymczasowym, a następnie przesyłana powrót do domeny Cloud Storage.