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.

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 formatu functions.storage aby utworzyć funkcję, która obsługuje Wydarzenia: Cloud Storage. W zależności od tego, czy chcesz zawęzić zakres do określonego zasobnika Cloud Storage lub użyj domyślnej użyj jednej z tych wartości:

Na przykład przykład generatora miniatur jest ograniczony do domyślnego zasobnika w projekcie:

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

Cloud Storage obsługuje te zdarzenia:

  • onArchive Wysyłane tylko wtedy, gdy zasobnik ma włączoną obsługę wersji obiektu. 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 Obejmuje to obiekty, 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.
  • 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ładowe generowanie miniatur używa niektórych z tych atrybutów do wykrywania zdarzeń wyjściowych przypadków, 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, na której działa Twój kod.

Aby łatwo pobierać i ponownie przesyłać obiekty do usługi Cloud Storage, zainstaluj pakiet Google Cloud Storage za pomocą npm install --save @google-cloud/storage i zaimportuj go. Aby używać obietnic JavaScript 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 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 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 zwrócić obietnicę JavaScriptu w funkcji wywołania zwrotnego.

Przykład: przekształcenie obrazu

Używanie Cloud Functions razem z programami do przetwarzania obrazu, takimi jak sharp, możesz osiągnąć manipulowania plikami graficznymi. Oto przykład tego, jak utwórz obraz 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 Miniatura obrazu 200 x 200 zapisanego w katalogu tymczasowym, a następnie przesyłana powrót do domeny Cloud Storage.

Więcej przykładów

Więcej przykładów typowych funkcji przetwarzania multimediów, w tym transkodowanie obrazów, moderowanie treści i wyodrębnianie metadanych EXIF. Pełną listę przykładów to znajdziesz na GitHubie.