Możesz uruchomić funkcję w odpowiedzi na przesyłanie, aktualizowanie lub usuwanie plików i folderów w Cloud Storage.
Przykłady na tej stronie są oparte na przykładowej funkcji, która uruchamia się, 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 instancji Cloud Functions oraz inne podstawy obsługi zdarzeń Cloud Storage.
Więcej przykładów zastosowań znajdziesz w artykule Co mogę zrobić z Cloud Functions?
Wyzwól funkcję przy zmianach Cloud Storage
Użyj functions.storage
, aby utworzyć funkcję obsługującą zdarzenia Cloud Storage. W zależności od tego, czy chcesz ograniczyć swoją funkcję do określonego zasobnika Cloud Storage, czy użyć zasobnika domyślnego, użyj jednego z poniższych:
-
functions.storage.object()
do nasłuchiwania zmian obiektów w domyślnym zasobniku Cloud Storage. -
functions.storage.bucket('bucketName').object()
do nasłuchiwania zmian obiektów w określonym zasobniku.
Na przykład próbka generatora miniatur jest ograniczona do domyślnego zasobnika dla projektu:
exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => { // ... });
Cloud Storage obsługuje te zdarzenia:
-
onArchive
Wysyłane tylko wtedy, gdy w zasobniku włączono wersjonowanie obiektów . To zdarzenie wskazuje, że aktywna wersja obiektu stała się wersją zarchiwizowaną, ponieważ została zarchiwizowana lub została zastąpiona przez przesłany obiekt o tej samej nazwie. -
onDelete
Wysyłane, gdy obiekt został trwale usunięty. Obejmuje to obiekty, które są zastępowane lub usuwane w ramach konfiguracji cyklu życia zasobnika . W przypadku zasobników z włączoną obsługą wersji obiektów nie jest to wysyłane, gdy obiekt jest archiwizowany (patrzonArchive
), nawet jeśli archiwizacja odbywa się za pomocą metodystorage.objects.delete
. -
onFinalize
Wysyłane, gdy nowy obiekt (lub nowa generacja istniejącego obiektu) zostanie pomyślnie utworzony w zasobniku. Obejmuje to kopiowanie lub przepisywanie istniejącego obiektu. Nieudane przesyłanie nie wyzwala tego zdarzenia. -
onMetadataUpdate
Wysyłane, gdy zmieniają się metadane 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 szereg atrybutów obiektu Cloud Storage, takich jak size
i contentType
dla zaktualizowanego pliku. Atrybut „metageneration” jest zwiększany za każdym razem, gdy następuje 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.
Próbka 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. Jednak aby wykonywać intensywne zadania, takie jak generowanie obrazu miniatury z pliku przechowywanego w Cloud Storage, musisz pobrać pliki do instancji funkcji, czyli maszyny wirtualnej, na której działa 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'); const admin = require('firebase-admin'); admin.initializeApp() const path = require('path'); //library for resizing images const sharp = require('sharp');
Użyj narzędzia gcs.bucket.file(filePath).download
aby pobrać plik do katalogu tymczasowego w instancji Cloud Functions. W tej lokalizacji możesz przetworzyć plik zgodnie z potrzebami, a następnie przesłać go do Cloud Storage. Podczas wykonywania zadań asynchronicznych upewnij się, że zwracasz obietnicę JavaScript w wywołaniu zwrotnym.
Przykład: transformacja obrazu
Używając Cloud Functions wraz z programami do przetwarzania obrazu, takimi jak sharp
, możesz wykonywać manipulacje na graficznych plikach graficznych. Poniżej przedstawiono przykład tworzenia obrazu miniatury dla 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ę 200 x 200 dla obrazu zapisanego w katalogu tymczasowym, a następnie przesyła go z powrotem do Cloud Storage.
Poznaj więcej przykładów
Więcej przykładów typowych funkcji transformacji multimediów, w tym transkodowanie obrazów , moderowanie treści , wyodrębnianie metadanych EXIF . Pełna lista przykładów jest dostępna na GitHub.