Cloud Storage tetikleyicileri


Bir işlevi, kullanıcı tarafından oluşturulan yükleme, güncelleme veya Cloud Storage'da dosya ve klasör silme.

Bu sayfadaki örnekler, resim reklamınızı tıkladığında tetiklenen örnek bir işleve dosyaları Cloud Storage'a yüklenir. Bu örnek işlevde, etkinlik özelliklerine nasıl erişilir, Cloud Functions'a dosya indirme örneği ve Cloud Storage etkinliklerinin işlenmesiyle ilgili diğer temel bilgiler.

Gerekli modülleri içe aktarın

Başlamak için Cloud Storage'ı kullanmak üzere gereken modülü içe aktarın etkinlikler:

Node.js

 const {onObjectFinalized} = require("firebase-functions/v2/storage");

Python

 from firebase_functions import storage_fn

Örneklemin tamamını oluşturmak amacıyla, aynı zamanda Firebase Admin SDK'sı ve resim işleme araçları:

Node.js

 const {initializeApp} = require("firebase-admin/app");
const {getStorage} = require("firebase-admin/storage");
const logger = require("firebase-functions/logger");
const path = require("path");

// library for image resizing
const sharp = require("sharp");

initializeApp();

Python

 import io
import pathlib

from PIL import Image

from firebase_admin import initialize_app

initialize_app()
from firebase_admin import storage

Cloud Storage işlevinin kapsamını belirleme

belirli bir Cloud Storage paketine atayın ve istediğiniz seçenekleri ayarlayın:

Node.js

// scope handler to a specific bucket, using storage options parameter
export archivedopts = onObjectArchived({ bucket: "myBucket" }, (event) => {
  //…
});

Python

# Scope handler to a specific bucket using storage options parameter
@storage_fn.on_object_archived(bucket="myBucket")
def archived_bucket(event: storage_fn.CloudEvent[storage_fn.StorageObjectData]):
    # ...

Buna karşılık, örnek küçük resim oluşturucu işlevinin kapsamı, temsil eder:

Node.js

exports.generateThumbnail = onObjectFinalized({cpu: 2}, async (event) => {
// ...
});

Python

@storage_fn.on_object_archived()
def generatethumbnail(event: storage_fn.CloudEvent[storage_fn.StorageObjectData]):
    # ...

İşlev konumunu ayarlama

Proje yönetimi ekibi ile konum, dağıtım hatasına neden olabilir. Ayrıca, konumlar arasındaki mesafe bir Cloud Storage paketinin konumunu görebilir ve işlevin konumu, ağ gecikmesi. Bu durumları önlemek için işlev konumunu şu yöntemlerden biriyle paket/tetikleyici konumuyla eşleşir:

  • İşlev konumu, tetikleyici konumuyla aynı
  • İşlev konumu, tetikleyici konumunun içindedir (tetikleyici bölgesi ikili/çoklu bölge)
  • Tetikleyici bölgesi us-central1 olarak ayarlanırsa işlev herhangi bir konumda olabilir

Cloud Storage etkinliklerini yönetme

Cloud Storage etkinliklerine yanıt vermek için kullanabileceğiniz şu işleyiciler kullanılabilir:

Node.js

  • onObjectArchived Yalnızca bir paket etkinleştirildiğinde gönderilir nesne sürümü oluşturma. Bu etkinlik, bir nesnenin canlı sürümünün nedeninin arşivlenmiş olması veya dosyanın üzerine yazılır.
  • onObjectDeleted Bir nesne kalıcı olarak silindiğinde gönderilir. Bu üzerine yazılan veya paketin bir parçası olarak silinen nesneleri içerir. yaşam döngüsü yapılandırması hakkında daha fazla bilgi edinin. Şu kovalar için: nesne sürümü oluşturma etkinleştirildiğinde, bir nesne arşivlendiğinde (bkz. onArchive) bu ileti gönderilmez. storage.objects.delete yöntemiyle arşivlenir.
  • onObjectFinalized Yeni bir nesne (veya bir öğenin yeni nesli nesne) pakette başarıyla oluşturulduğu anlamına gelir. Kopyalama işlemi, mevcut bir nesneyi yeniden yazabilirsiniz. Başarısız olan bir yükleme, bu etkinliği tetiklemez.
  • onMetadataUpdated Mevcut bir nesnenin meta verileri değiştiğinde gönderilir.

Python

  • on_object_archived Yalnızca bir paket etkinleştirildiğinde gönderilir nesne sürümü oluşturma. Bu etkinlik, bir nesnenin canlı sürümünün nedeninin arşivlenmiş olması veya dosyanın üzerine yazılır.
  • on_object_deleted Bir nesne kalıcı olarak silindiğinde gönderilir. Bu üzerine yazılan veya paketin bir parçası olarak silinen nesneleri içerir. yaşam döngüsü yapılandırması hakkında daha fazla bilgi edinin. Şu kovalar için: nesne sürümü oluşturma etkinleştirildiğinde, bir nesne arşivlendiğinde (bkz. onArchive) bu ileti gönderilmez. storage.objects.delete yöntemiyle arşivlenir.
  • on_object_finalized Yeni bir nesne (veya bir öğenin yeni nesli nesne) pakette başarıyla oluşturulduğu anlamına gelir. Kopyalama işlemi, mevcut bir nesneyi yeniden yazabilirsiniz. Başarısız olan bir yükleme, bu etkinliği tetiklemez.
  • on_metadata_updated Mevcut bir nesnenin meta verileri değiştiğinde gönderilir.

Cloud Storage nesne özelliklerine erişme

Cloud Functions, bir dizi Cloud Storage nesne özelliğini sunar. (ör. nesnenin boyutu ve içerik türü güncellendi). metageneration özelliğinde bir değişiklik olduğunda meta verileri. Yeni nesneler için metageneration değeri 1 olur.

Node.js

const fileBucket = event.data.bucket; // Storage bucket containing the file.
const filePath = event.data.name; // File path in the bucket.
const contentType = event.data.contentType; // File content type.

Python

bucket_name = event.data.bucket
file_path = pathlib.PurePath(event.data.name)
content_type = event.data.content_type

Küçük resim oluşturma örneği, çıkışı algılamak için bu özelliklerden bazılarını kullanır işlevin şu sonuçları döndürdüğü durumlar:

Node.js

// Exit if this is triggered on a file that is not an image.
if (!contentType.startsWith("image/")) {
  return logger.log("This is not an image.");
}
// Exit if the image is already a thumbnail.
const fileName = path.basename(filePath);
if (fileName.startsWith("thumb_")) {
  return logger.log("Already a Thumbnail.");
}

Python

# Exit if this is triggered on a file that is not an image.
if not content_type or not content_type.startswith("image/"):
    print(f"This is not an image. ({content_type})")
    return

# Exit if the image is already a thumbnail.
if file_path.name.startswith("thumb_"):
    print("Already a thumbnail.")
    return

Dosya indirme, dönüştürme ve yükleme

Bazı durumlarda Cloud Storage. Bununla birlikte, yeni bir model oluşturmak gibi Cloud Storage'da depolanan bir dosyadan alınan küçük resim dosyasını indirmek için örneğin bir sanal makineyi çalıştıran bir sanal makineye kodunuz.

Cloud Functions'ı aşağıdakiler gibi görüntü işleme programlarıyla birlikte kullanarak: Node.js için sharp Python için Pillow ve gerçekleştirebileceğiniz grafik görüntü dosyaları üzerinde değişiklikler. Aşağıda, bu tür bir riskin Yüklenen bir resim dosyası için küçük resim oluşturma:

Node.js

/**
 * When an image is uploaded in the Storage bucket,
 * generate a thumbnail automatically using sharp.
 */
exports.generateThumbnail = onObjectFinalized({cpu: 2}, async (event) => {

  const fileBucket = event.data.bucket; // Storage bucket containing the file.
  const filePath = event.data.name; // File path in the bucket.
  const contentType = event.data.contentType; // File content type.

  // Exit if this is triggered on a file that is not an image.
  if (!contentType.startsWith("image/")) {
    return logger.log("This is not an image.");
  }
  // Exit if the image is already a thumbnail.
  const fileName = path.basename(filePath);
  if (fileName.startsWith("thumb_")) {
    return logger.log("Already a Thumbnail.");
  }

  // Download file into memory from bucket.
  const bucket = getStorage().bucket(fileBucket);
  const downloadResponse = await bucket.file(filePath).download();
  const imageBuffer = downloadResponse[0];
  logger.log("Image downloaded!");

  // Generate a thumbnail using sharp.
  const thumbnailBuffer = await sharp(imageBuffer).resize({
    width: 200,
    height: 200,
    withoutEnlargement: true,
  }).toBuffer();
  logger.log("Thumbnail created");

  // Prefix 'thumb_' to file name.
  const thumbFileName = `thumb_${fileName}`;
  const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);

  // Upload the thumbnail.
  const metadata = {contentType: contentType};
  await bucket.file(thumbFilePath).save(thumbnailBuffer, {
    metadata: metadata,
  });
  return logger.log("Thumbnail uploaded!");
});

Dosyayı geçici bir Cloud Functions örneğinizdeki dizin oluşturur. Bu konumda şunları yapabilirsiniz: dosyayı gerektiği gibi işleyip Cloud Storage'a yükleyin. Zaman eş zamansız görevleri yerine getirmek için, geri arama.

Python

@storage_fn.on_object_finalized()
def generatethumbnail(event: storage_fn.CloudEvent[storage_fn.StorageObjectData]):
    """When an image is uploaded in the Storage bucket, generate a thumbnail
    automatically using Pillow."""

    bucket_name = event.data.bucket
    file_path = pathlib.PurePath(event.data.name)
    content_type = event.data.content_type

    # Exit if this is triggered on a file that is not an image.
    if not content_type or not content_type.startswith("image/"):
        print(f"This is not an image. ({content_type})")
        return

    # Exit if the image is already a thumbnail.
    if file_path.name.startswith("thumb_"):
        print("Already a thumbnail.")
        return

    bucket = storage.bucket(bucket_name)

    image_blob = bucket.blob(str(file_path))
    image_bytes = image_blob.download_as_bytes()
    image = Image.open(io.BytesIO(image_bytes))

    image.thumbnail((200, 200))
    thumbnail_io = io.BytesIO()
    image.save(thumbnail_io, format="png")
    thumbnail_path = file_path.parent / pathlib.PurePath(f"thumb_{file_path.stem}.png")
    thumbnail_blob = bucket.blob(str(thumbnail_path))
    thumbnail_blob.upload_from_string(thumbnail_io.getvalue(), content_type="image/png")

Bu kod, Geçici bir dizine kaydedilen ve ardından yüklenen resim için 200x200 küçük resim Cloud Storage'a dönebilir.