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 uzyskiwać dostęp do atrybutów zdarzenia, jak pobierać pliki do instancji Cloud Functions i jak radzić sobie z innymi podstawami obsługi zdarzeń Cloud Storage.
Więcej przykładów zastosowań znajdziesz w artykule Czynności, które można wykonywać w aplikacji Cloud Functions.
Aktywuj funkcję po zmianie wartości Cloud Storage
Użyj funkcji functions.storage
, aby utworzyć funkcję, która obsługuje zdarzenia Cloud Storage. W zależności od tego, czy chcesz ograniczyć zakres funkcji do konkretnego zasobnika Cloud Storage, czy użyć domyślnego zasobnika, wykonaj jedną z tych czynności:
functions.storage.object()
, aby nasłuchiwać zmian obiektów w domyślnym zasobniku Cloud Storage.functions.storage.bucket('bucketName').object()
aby sprawdzać zmiany obiektów w konkretnym katalogu.
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 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.- Wysyłane, gdy obiekt został trwale usunięty.
onDelete
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 (patrzonArchive
), nawet jeśli archiwizacja nastąpiła za pomocą metodystorage.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 obiekcie on
tak, jak pokazano powyżej w przypadku onFinalize
.
Dostęp do atrybutów obiektu Cloud Storage
Cloud Functions udostępnia wiele atrybutów obiektu Cloud Storage, takich jak size
i contentType
dla zaktualizowanego pliku. Atrybut 'metageneration' jest zwiększany za każdym razem, gdy nastąpi zmiana metadanych obiektu. W przypadku nowych obiektów wartość metageneration
to 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.'); }
Pobieranie, przekształcanie i przesyłanie pliku
W niektórych przypadkach pobieranie plików z Cloud Storage może nie być konieczne. Jednak aby wykonywać bardziej intensywne zadania, takie jak generowanie obrazu miniatury z pliku zapisanego w usłudze Cloud Storage, musisz pobrać pliki do instancji funkcji, czyli do maszyny wirtualnej, która uruchamia kod.
Aby łatwo pobrać i ponownie przesłać obiekty do Cloud Storage, zainstaluj Google Cloud Storagepakiet 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 tymczasowego katalogu w instancji Cloud Functions. W tym miejscu możesz przetworzyć plik zgodnie z potrzebami, a potem przesłać go do Cloud Storage. Podczas wykonywania zadań asynchronicznych pamiętaj, aby zwrócić obietnicę JavaScriptu w funkcji wywołania zwrotnego.
Przykład: przekształcenie obrazu
Korzystając z Cloud Functions i programów do przetwarzania obrazów, takich jak sharp
, możesz manipulować plikami graficznymi. Oto przykład tworzenia miniatury przesł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 ją z powrotem do Cloud Storage.
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łną listę przykładów znajdziesz w GitHub.