Wyzwalacze Cloud Storage


Możesz uruchomić funkcję w odpowiedzi na przesłanie, aktualizację lub usunięcie plików i folderów w Cloud Storage.

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

Więcej przykładów zastosowań znajdziesz w artykule Co mogę zrobić z Cloud Functions?

Uruchom funkcję w przypadku zmian w Cloud Storage

Użyj functions.storage , aby utworzyć funkcję obsługującą zdarzenia Cloud Storage. W zależności od tego, czy chcesz ograniczyć zakres swojej funkcji do konkretnego segmentu Cloud Storage, czy użyć segmentu domyślnego, użyj jednej z poniższych opcji:

Na przykład zakres przykładowego generatora miniatur obejmuje domyślny zasobnik projektu:

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

Cloud Storage obsługuje następujące zdarzenia:

  • onArchive Wysyłane tylko wtedy, gdy segment ma włączoną opcję wersjonowania obiektów . To zdarzenie wskazuje, że aktywna wersja obiektu stała się wersją zarchiwizowaną, ponieważ została zarchiwizowana lub została nadpisana przez przesłanie obiektu o tej samej nazwie.
  • onDelete Wysyłane, gdy obiekt został trwale usunięty. Obejmuje to obiekty, które zostały nadpisane lub usunięte w ramach konfiguracji cyklu życia zasobnika. W przypadku zasobników z włączoną wersjonowaniem obiektów nie jest to wysyłane, gdy obiekt jest archiwizowany (zobacz onArchive ), nawet jeśli archiwizacja odbywa się za pomocą metody storage.objects.delete .
  • onFinalize Wysyłane, gdy w zasobniku pomyślnie utworzono nowy obiekt (lub nową generację istniejącego obiektu). Obejmuje to kopiowanie lub przepisywanie istniejącego obiektu. Nieudane przesyłanie nie powoduje wyzwolenia tego zdarzenia.
  • onMetadataUpdate Wysyłane w przypadku zmiany metadanych istniejącego obiektu.

Ustaw zdarzenie w procedurze obsługi zdarzeń on , jak pokazano powyżej, dla onFinalize .

Uzyskaj dostęp do atrybutów obiektu Cloud Storage

Cloud Functions udostępnia dla zaktualizowanego pliku wiele atrybutów obiektu Cloud Storage, takich jak size i contentType . Atrybut „metageneracja” jest zwiększany za każdym razem, gdy nastąpi zmiana w metadanych obiektu. Dla nowych obiektów wartość metageneration wynosi 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 miniatur wykorzystuje niektóre 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.');
}

Pobierz, przekształć i prześlij plik

W niektórych przypadkach pobieranie plików z Cloud Storage może nie być konieczne. Aby jednak wykonywać intensywne zadania, takie jak generowanie miniatury z pliku przechowywanego w Cloud Storage, musisz pobrać pliki do instancji funkcji, czyli maszyny wirtualnej, na której uruchamiany jest Twój kod.

Aby łatwo pobierać i ponownie przesyłać obiekty do Cloud Storage, zainstaluj pakiet Google Cloud Storage za pomocą npm install --save @google-cloud/storage i zaimportuj go. Aby użyć obietnic JavaScript do obsługi procesów zewnętrznych, takich jak zadania przetwarzania miniatur w przykładzie, zaimportuj także 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 gcs.bucket.file(filePath).download aby pobrać plik do katalogu tymczasowego w instancji Cloud Functions. W tej lokalizacji możesz w razie potrzeby przetworzyć plik, a następnie przesłać go do Cloud Storage. Wykonując zadania asynchroniczne, pamiętaj o zwróceniu obietnicy JavaScript w wywołaniu zwrotnym.

Przykład: transformacja obrazu

Używając Cloud Functions wraz z programami do przetwarzania obrazów, takimi jak sharp , możesz wykonywać operacje na plikach obrazów graficznych. Poniżej znajduje się przykład tworzenia miniatury przesłanego pliku obrazu:

// 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ę obrazu o wymiarach 200x200 zapisanego w katalogu tymczasowym, a następnie przesyła ją z powrotem do Cloud Storage.

Poznaj więcej przykładów

Więcej przykładów typowych funkcji transformacji mediów, w tym transkodowania obrazów , moderowania treści , wyodrębniania metadanych EXIF . Pełna lista przykładów jest dostępna na GitHubie.