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 są oparte na przykładowej funkcji, która jest aktywowana, gdy pliki graficzne są przesyłane do Cloud Storage. Ta przykładowa funkcja pokazuje, jak uzyskać dostęp do atrybutów zdarzenia, jak pobrać plik do instancji Cloud Functions oraz inne podstawowe informacje o obsłudze zdarzeń Cloud Storage.
Więcej przykładów zastosowań znajdziesz w artykule Co mogę zrobić za pomocą Cloud Functions?.
Aktywuj funkcję po zmianach w Cloud Storage
Użyj 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ć zasobnika domyślnego, użyj jednej z tych opcji:
functions.storage.object(), aby nasłuchiwać zmian obiektów w domyślnym zasobniku Cloud Storage.functions.storage.bucket('bucketName').object(), aby nasłuchiwać zmian obiektów w określonym zasobniku.
Na przykład generator miniatur jest ograniczony do domyślnego zasobnika projektu:
exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => { // ... });
Cloud Storage obsługuje te zdarzenia:
onArchiveWysył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.onDeleteWysył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 (patrzonArchive), nawet jeśli archiwizacja nastąpi za pomocą metodystorage.objects.delete.onFinalizeWysył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.onMetadataUpdateWysyłane po zmianie metadanych istniejącego obiektu.
Ustaw zdarzenie w module obsługi zdarzeń on, jak pokazano powyżej w przypadku onFinalize.
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 zmieniają się metadane 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ładowa funkcja generowania miniatur 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 aby wykonywać intensywne zadania, takie jak generowanie miniatury z pliku przechowywanego w Cloud Storage, musisz pobrać pliki do instancji funkcji, czyli maszyny wirtualnej, która uruchamia 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żywać obietnic JavaScriptu do obsługi procesów zewnętrznych, takich jak zadania przetwarzania miniatur w przykładzie, zaimportuj też child-process-promise:
const functions = require('firebase-functions/v1'); const { initializeApp } = require('firebase-admin/app'); const { getStorage } = require('firebase-admin/storage'); initializeApp(); const path = require('path'); //library for resizing images const sharp = /** @type {typeof import('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 przetworzyć plik zgodnie z potrzebami, a następnie przesłać go do Cloud Storage. Podczas wykonywania zadań asynchronicznych pamiętaj, aby w wywołaniu zwrotnym zwrócić obietnicę JavaScript.
Przykład: przekształcanie obrazów
Używając Cloud Functions razem z programami do przetwarzania obrazów, takimi jak sharp, możesz wykonywać operacje na plikach graficznych. Oto przykład, jak utworzyć obraz miniatury dla przesłanego pliku obrazu:
// Download file from bucket. const bucket = getStorage().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ę o wymiarach 200 x 200 dla obrazu zapisanego w katalogu tymczasowym, a następnie przesyła ją z powrotem do Cloud Storage.
Więcej przykładów
Więcej przykładów typowych funkcji przekształcania multimediów, w tym transkodowanie obrazów, moderowanie treści i wyodrębnianie metadanych EXIF. Pełna lista przykładów jest dostępna na GitHubie.