Bulut Depolama tetikleyicileri


Cloud Storage'daki dosya ve klasörlerin yüklenmesine, güncellenmesine veya silinmesine yanıt olarak bir işlevi tetikleyebilirsiniz.

Bu sayfadaki örnekler, görüntü dosyaları Cloud Storage'a yüklendiğinde tetiklenen örnek bir işlevi temel alır. Bu örnek işlev, olay özniteliklerine nasıl erişileceğini, bir dosyanın Cloud Functions örneğine nasıl indirileceğini ve Cloud Storage olaylarını işlemeye ilişkin diğer temelleri gösterir.

Gerekli modülleri içe aktarın

Başlamak için Cloud Storage olaylarını işlemek için gereken modülü içe aktarın:

Node.js

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

Piton

 from firebase_functions import storage_fn

Örneğin tamamını oluşturmak için Firebase Admin SDK'ya ve görüntü işleme araçlarına yönelik bağımlılıkları da ekleyin:

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();

Piton

 import io
import pathlib

from PIL import Image

from firebase_admin import initialize_app

initialize_app()
from firebase_admin import storage

Bulut Depolama işlevinin kapsamını belirleyin

İşlevinizin kapsamını belirli bir Cloud Storage paketine ayarlamak ve istediğiniz seçenekleri ayarlamak için aşağıdaki modeli kullanın:

Node.js

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

Piton

# 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şturma işlevinin kapsamı projenin varsayılan paketine göre ayarlanmıştır:

Node.js

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

Piton

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

İşlev konumunu ayarlayın

Konumlar arasındaki uyumsuzluk, dağıtımın başarısız olmasına neden olabilir. Ayrıca Cloud Storage grubunun konumu ile işlevin konumu arasındaki mesafe önemli ağ gecikmesine neden olabilir. Bu durumlardan kaçınmak için işlev konumunu , paket/tetikleyici konumuyla eşleşecek şekilde aşağıdaki yollardan biriyle belirtin:

  • İşlev konumu tetikleme konumuyla aynıdır
  • İşlev konumu tetikleyici konumun içindedir (tetikleyici bölge ikili/çoklu bölge olduğunda)
  • Tetikleme bölgesi us-central1 olarak ayarlandıysa işlev herhangi bir konumda olabilir

Cloud Storage olaylarını yönetin

Cloud Storage olaylarına yanıt vermeye yönelik bu işleyiciler mevcuttur:

Node.js

  • onObjectArchived Yalnızca bir paket nesne sürümü oluşturmayı etkinleştirdiğinde gönderilir. Bu olay, bir nesnenin canlı sürümünün, arşivlenmiş olması veya aynı adlı bir nesnenin yüklenmesiyle üzerine yazılması nedeniyle arşivlenmiş bir sürüm haline geldiğini gösterir.
  • onObjectDeleted Bir nesne kalıcı olarak silindiğinde gönderilir. Bu, paketin yaşam döngüsü yapılandırmasının bir parçası olarak üzerine yazılan veya silinen nesneleri içerir. Nesne sürümü oluşturmanın etkin olduğu paketler için, arşivleme storage.objects.delete yöntemi aracılığıyla gerçekleşse bile bir nesne arşivlendiğinde (bkz. onArchive ) bu gönderilmez.
  • onObjectFinalized Pakette yeni bir nesne (veya mevcut bir nesnenin yeni nesli) başarıyla oluşturulduğunda gönderilir. Buna mevcut bir nesnenin kopyalanması veya yeniden yazılması da dahildir. Başarısız bir yükleme bu olayı tetiklemez.
  • onMetadataUpdated Mevcut bir nesnenin meta verileri değiştiğinde gönderilir.

Piton

  • on_object_archived Yalnızca bir paket nesne sürümü oluşturmayı etkinleştirdiğinde gönderilir. Bu olay, bir nesnenin canlı sürümünün, arşivlenmiş olması veya aynı adlı bir nesnenin yüklenmesiyle üzerine yazılması nedeniyle arşivlenmiş bir sürüm haline geldiğini gösterir.
  • on_object_deleted Bir nesne kalıcı olarak silindiğinde gönderilir. Bu, paketin yaşam döngüsü yapılandırmasının bir parçası olarak üzerine yazılan veya silinen nesneleri içerir. Nesne sürümü oluşturmanın etkin olduğu paketler için, arşivleme storage.objects.delete yöntemi aracılığıyla gerçekleşse bile bir nesne arşivlendiğinde (bkz. onArchive ) bu gönderilmez.
  • on_object_finalized Pakette yeni bir nesne (veya mevcut bir nesnenin yeni nesli) başarıyla oluşturulduğunda gönderilir. Buna mevcut bir nesnenin kopyalanması veya yeniden yazılması da dahildir. Başarısız bir yükleme bu olayı tetiklemez.
  • on_metadata_updated Mevcut bir nesnenin meta verileri değiştiğinde gönderilir.

Cloud Storage nesne niteliklerine erişme

Bulut İşlevleri, güncellenen dosya için nesnenin boyutu ve içerik türü gibi bir dizi Bulut Depolama nesnesi niteliğini ortaya çıkarır. Nesnenin meta verilerinde bir değişiklik olduğunda metageneration özelliği artırılır. Yeni nesneler için metageneration değeri 1 .

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.

Piton

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, işlevin geri döndüğü çıkış durumlarını algılamak için bu özniteliklerden bazılarını kullanır:

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.");
}

Piton

# 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'dan dosya indirmeniz gerekmeyebilir. Ancak Bulut Depolama'da depolanan bir dosyadan küçük resim görüntüsü oluşturmak gibi yoğun görevleri gerçekleştirmek için dosyaları işlevler örneğine, yani kodunuzu çalıştıran sanal makineye indirmeniz gerekir.

Cloud Functions'ı sharp for Node.js ve Pillow for Python gibi görüntü işleme programlarıyla birlikte kullanarak grafik görüntü dosyaları üzerinde manipülasyonlar gerçekleştirebilirsiniz. Aşağıda, yüklenen bir resim dosyası için küçük resim resminin nasıl oluşturulacağına ilişkin bir örnek verilmiştir:

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ı Cloud Functions örneğinizdeki geçici bir dizine indirin. Bu konumda dosyayı gerektiği gibi işleyebilir ve ardından Cloud Storage'a yükleyebilirsiniz. Eşzamansız görevleri gerçekleştirirken, geri aramanızda bir JavaScript vaadi döndürdüğünüzden emin olun.

Piton

@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 görüntü için 200x200 boyutunda bir küçük resim oluşturur ve ardından bunu Cloud Storage'a geri yükler.