Cloud Storage'daki dosya ve klasörlerin yüklenmesine, güncellenmesine veya silinmesine yanıt olarak bir işlevi tetikleyebilirsiniz.
Bu sayfadaki örnekler, resim dosyaları Cloud Storage'a yüklendiğinde tetiklenen örnek bir işleve dayanmaktadır. Bu örnek işlev, etkinlik özelliklerine nasıl erişileceğini, bir Cloud Functions örneğine dosya indirmeyi ve Cloud Storage etkinliklerini yönetmeyle ilgili diğer temel bilgileri gösterir.
Gerekli modülleri içe aktarın
Başlamak üzere Cloud Storage etkinliklerini yönetmek için gereken modülü içe aktarın:
Node.js
const {onObjectFinalized} = require("firebase-functions/v2/storage");
Python
from firebase_functions import storage_fn
Tam örneği oluşturmak için Firebase Admin SDK'ya ve resim 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();
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
İşlevinizin kapsamını belirli bir Cloud Storage paketiyle sınırlamak ve istediğiniz seçenekleri belirlemek için aşağıdaki kalıbı kullanı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şlevi projenin varsayılan paketinin kapsamındadır:
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
Konumlar arasındaki uyuşmazlık, dağıtım hatasına neden olabilir. Ayrıca bir Cloud Storage paketinin konumu ile işlevin konumu arasındaki mesafe, önemli ölçüde ağ gecikmesine neden olabilir. Bu tür durumları önlemek için işlev konumunu belirterek paket/tetikleyici konumuyla aşağıdaki yöntemlerden birini kullanarak eşleşmesini sağlayın:
- İşlev konumu, tetikleyici konumuyla aynı
- İşlev konumu, tetikleyici konumunun içindedir (tetikleyici bölgesi çift/çoklu bölge olduğunda)
- 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 pakette nesne sürümü oluşturma etkinleştirildiğinde gönderilir. Bu etkinlik, bir nesnenin canlı sürümünün, arşivlendiği veya aynı ada sahip bir nesne yüklenmesi sonucunda üzerine yazıldığı için arşivlenmiş sürüm haline geldiğini gösterir.onObjectDeleted
Bir nesne kalıcı olarak silindiğinde gönderilir. Buna, paketin yaşam döngüsü yapılandırmasının bir parçası olarak üzerine yazılan veya silinen nesneler dahildir. Nesnede sürüm oluşturma özelliğinin etkinleştirildiği paketlerde, arşivlemestorage.objects.delete
yöntemiyle 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. Bu, mevcut bir nesneyi kopyalamayı veya yeniden yazmayı içerir. 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 pakette nesne sürümü oluşturma etkinleştirildiğinde gönderilir. Bu etkinlik, bir nesnenin canlı sürümünün, arşivlendiği veya aynı ada sahip bir nesne yüklenmesi sonucunda üzerine yazıldığı için arşivlenmiş sürüm haline geldiğini gösterir.on_object_deleted
Bir nesne kalıcı olarak silindiğinde gönderilir. Buna, paketin yaşam döngüsü yapılandırmasının bir parçası olarak üzerine yazılan veya silinen nesneler dahildir. Nesnede sürüm oluşturma özelliğinin etkinleştirildiği paketlerde, arşivlemestorage.objects.delete
yöntemiyle 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. Bu, mevcut bir nesneyi kopyalamayı veya yeniden yazmayı içerir. 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, güncellenen dosya için nesnenin boyutu ve içerik türü gibi çeşitli Cloud Storage nesne özelliklerini sunar. Nesnenin meta verilerinde değişiklik olduğunda metageneration
özelliği artar. 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, işlevin döndürdüğü çıkış durumlarını algılamak için şu özelliklerden 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."); }
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'dan dosya indirmeniz gerekmeyebilir. Ancak Cloud Storage'da depolanan bir dosyadan küçük resim oluşturma gibi yoğun görevleri gerçekleştirmek için dosyaları işlev örneğine, yani kodunuzu çalıştıran sanal makineye indirmeniz gerekir.
Cloud Functions'ı Node.js için sharp
ve Python için Pillow gibi görüntü işleme programlarıyla birlikte kullanarak grafik görüntü dosyaları üzerinde manipülasyonlar yapabilirsiniz. Aşağıda, yüklenen resim dosyası için küçük resim oluşturmanın nasıl yapılacağına dair 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ı gereken şekilde işleyebilir ve ardından Cloud Storage'a yükleyebilirsiniz. Eşzamansız görevleri gerçekleştirirken, geri çağırmanızda bir JavaScript taahhüdünü döndürdüğünüzden emin olun.
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 resim için 200x200 boyutunda bir küçük resim oluşturur ve ardından bu resmi Cloud Storage'a geri yükler.