Cloud Storage uygulamasında dosya ve klasörlerin yüklenmesi, güncellenmesi veya silinmesine yanıt olarak bir işlevi tetikleyebilirsiniz.
Bu sayfadaki örnekler, resim dosyaları Cloud Storage konumuna yüklendiğinde tetiklenen örnek bir işlevi temel alır. Bu örnek işlev, etkinlik özelliklerine nasıl erişileceğini, bir dosyanın Cloud Functions örneğine nasıl indirileceğini ve Cloud Storage etkinliklerini işlemenin diğer temel noktalarını gösterir.
Gerekli modülleri içe aktarma
Başlamak için Cloud Storage etkinliklerini işlemek için gereken modülü içe aktarın:
Node.js
const {onObjectFinalized} = require("firebase-functions/storage");
Python
from firebase_functions import storage_fn
Örneğin tamamını oluşturmak için Firebase Admin SDK ve görüntü işleme araçlarının bağımlılıklarını 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 = /** @type {typeof import("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 ayarlamak için aşağıdaki kalıbı kullanın:
Node.js
// scope handler to a specific bucket, using storage options parameter
exports.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, proje için varsayılan paketle sınırlıdı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ında uyuşmazlık olması, dağıtımın başarısız olmasına neden olabilir. Ayrıca, Cloud Storage paketinin konumu ile işlevin konumu arasındaki mesafe, önemli ağ gecikmesine neden olabilir. Bu durumları önlemek için işlev konumunu, paket/tetikleyici konumuyla eşleşecek şekilde aşağıdaki yöntemlerden biriyle belirtin:
- İşlev konumu, tetikleyici konumuyla aynıdır.
- İşlev konumu, tetikleyici konumunun içindedir (tetikleyici bölgesi çift/çoklu bölge olduğunda)
- Tetikleyici bölgesi
us-central1olarak ayarlanırsa işlev herhangi bir konumda olabilir.
Cloud Storage etkinliklerini yönetme
Cloud Storage etkinliklerine yanıt vermek için şu işleyiciler kullanılabilir:
Node.js
onObjectArchivedYalnı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 nesnenin yüklenmesiyle üzerine yazıldığı için arşivlenmiş bir sürüm haline geldiğini gösterir.onObjectDeletedBir nesne kalıcı olarak silindiğinde gönderilir. Buna, üzerine yazılan veya paketin yaşam döngüsü yapılandırması kapsamında silinen nesneler de dahildir. Nesnede sürüm oluşturma özelliğinin etkinleştirildiği paketlerde, bir nesne arşivlendiğinde (onArchivebölümüne bakın) bu bildirim gönderilmez. Arşivleme işlemistorage.objects.deleteyöntemiyle yapılsa bile bu durum geçerlidir.onObjectFinalizedPakette yeni bir nesne (veya mevcut bir nesnenin yeni bir nesli) başarıyla oluşturulduğunda gönderilir. Mevcut bir nesneyi kopyalama veya yeniden yazma da buna dahildir. Başarısız olan bir yükleme, bu etkinliği tetiklemez.onMetadataUpdatedMevcut bir nesnenin meta verileri değiştiğinde gönderilir.
Python
on_object_archivedYalnı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 nesnenin yüklenmesiyle üzerine yazıldığı için arşivlenmiş bir sürüm haline geldiğini gösterir.on_object_deletedBir nesne kalıcı olarak silindiğinde gönderilir. Buna, üzerine yazılan veya paketin yaşam döngüsü yapılandırması kapsamında silinen nesneler de dahildir. Nesne sürüm oluşturma özelliği etkinleştirilmiş paketlerde, arşivlemestorage.objects.deleteyöntemiyle gerçekleşse bile bir nesne arşivlendiğinde (onArchivebölümüne bakın) bu bildirim gönderilmez.on_object_finalizedPakette yeni bir nesne (veya mevcut bir nesnenin yeni bir nesli) başarıyla oluşturulduğunda gönderilir. Mevcut bir nesneyi kopyalama veya yeniden yazma da buna dahildir. Başarısız olan bir yükleme, bu etkinliği tetiklemez.on_metadata_updatedMevcut bir nesnenin meta verileri değiştiğinde gönderilir.
Cloud Storage nesne özelliğine erişim
Cloud Functions, güncellenen dosya için nesnenin boyutu ve içerik türü gibi bir dizi Cloud Storage nesne özelliğini gösterir. metageneration özelliği, nesnenin meta verilerinde her değişiklik olduğunda artırılır. 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 bu ö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 adresinden dosya indirmek gerekmeyebilir. Ancak Cloud Storage içinde 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 ile birlikte Node.js için sharp ve Python için Pillow gibi görüntü işleme programlarını kullanarak grafik resim dosyaları üzerinde değişiklik yapabilirsiniz. Aşağıda, yüklenen bir resim dosyası için küçük resim oluşturma örneği 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 platformuna yükleyebilirsiniz. Eşzamansız görevleri gerçekleştirirken geri çağırma işlevinizde bir JavaScript Promise 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 tekrar Cloud Storage dizinine yükler.