Rozszerzanie Cloud Storage za pomocą Cloud Functions

.

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 opierają się na przykładowej funkcji, która uruchamia się, gdy obraz przesłano do usługi 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 tutaj: Co mogę robić w usłudze Cloud Functions?

Aktywuj funkcję po wprowadzeniu Cloud Storage zmian

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ładowy generator miniaturek jest ograniczony do domyślnego zasobnika projekt:

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 do archiwizacji nastąpi metoda 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 module obsługi zdarzeń on w sposób podany powyżej dla onFinalize.

Dostęp do atrybutów obiektu Cloud Storage

Funkcja Cloud Functions ujawnia pewną liczbę atrybutów obiektu Cloud Storage, takich jak jako size. oraz contentType. pliku. 'metageneration' jest zwiększany po każdej zmianie do metadanych obiektu. W przypadku nowych obiektów metageneration ma wartość 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 miniatury 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 usługi Cloud Storage Jednak do wykonania intensywnych zadań, takich jak generowanie miniatura z pliku zapisanego na Cloud Storage, musisz pobrać do instancji funkcji, czyli uruchomionej maszyny wirtualnej. kod.

Aby łatwo pobierać i ponownie przesyłać obiekty do Cloud Storage, zainstaluj Google Cloud Storage pakiet za pomocą npm install --save @google-cloud/storage i zaimportuj go. Aby użyć JavaScriptu obsługuje procesy zewnętrzne, takie jak zadania przetwarzania miniatur przykład, 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 gcs.bucket.file(filePath).download, aby pobrać plik jako plik tymczasowy w instancji Cloud Functions. W tej lokalizacji możesz przetworzyć plik zgodnie z potrzebami, a następnie przesłać go do Cloud Storage. Kiedy wykonywać zadania asynchroniczne, upewnij się, że w tagu oddzwanianie.

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 miniaturę 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.

Zobacz więcej przykładów

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