Bir işlevi, kullanıcı tarafından oluşturulan yükleme, güncelleme veya Cloud Storage dosya ve klasör siliniyor.
Bu sayfadaki örnekler, resim reklamınızı tıkladığında tetiklenen örnek bir işleve dosya Cloud Storage hedefine yüklendi. Bu örnek işlevde, etkinlik özelliklerine nasıl erişileceği, bir dosyanın Cloud Functions örneğine nasıl indirileceği ve Cloud Storage etkinliklerini işlemeyle ilgili diğer temel bilgiler gösterilmektedir.
Gerekli modülleri içe aktarın
Başlamak üzere Cloud Storage kullanımı için gerekli modülü içe aktarın etkinlikler:
Node.js
const {onObjectFinalized} = require("firebase-functions/v2/storage");
Python
from firebase_functions import storage_fn
Örneğin tamamını oluşturmak için Firebase Admin SDK ve resim 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 = 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
işlevini belirli bir Cloud Storage paketine ayarlayı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şturma işlevi, projenin varsayılan paketiyle 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ındaki uyuşmazlık, dağıtımın başarısız olmasına neden olabilir. Ayrıca, konumlar arasındaki mesafe bir Cloud Storage paketinin konumu 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önetin
Cloud Storage etkinliklerine yanıt vermek için aşağıdaki 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, ya arşivlendiği ya da aynı ada sahip bir nesne yüklemesi ile üzerine yazıldığı için arşivlenmiş bir sürüm haline geldiğini belirtir.onObjectDeleted
Bir nesne kalıcı olarak silindiğinde gönderilir. Üzerine yazılan veya paketin yaşam döngüsü yapılandırması kapsamında silinen nesneleri içerir. Nesne sürüm oluşturma özelliğinin etkinleştirildiği paketlerde, bir nesnestorage.objects.delete
yöntemiyle arşivlendiğinde bile bu gönderilmez (onArchive
bölümüne bakın).onObjectFinalized
Yeni bir nesne (veya bir öğenin yeni nesli nesne) pakette başarıyla oluşturulduğu anlamına gelir. Kopyalama işlemi, veya 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, ya arşivlendiği ya da aynı ada sahip bir nesne yüklemesi ile üzerine yazıldığı için arşivlenmiş bir sürüm haline geldiğini belirtir.on_object_deleted
Bir nesne kalıcı olarak silindiğinde gönderilir. Üzerine yazılan veya paketin yaşam döngüsü yapılandırması kapsamında silinen nesneleri içerir. Nesne sürüm oluşturma özelliğinin etkinleştirildiği paketlerde, bir nesnestorage.objects.delete
yöntemiyle arşivlendiğinde bile bu gönderilmez (onArchive
bölümüne bakın).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 gösterir
(ö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
'dur.
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'ten dosya indirmeniz gerekmeyebilir. Bununla birlikte, yeni bir model oluşturmak gibi Cloud Storage içinde depolanan bir dosyadan küçük resim örneğin, çalışan sanal makineyi çalıştıran bir sanal makine kodunuz.
Cloud Functions'ü Node.js için sharp
ve Python için Pillow gibi resim işleme programlarıyla birlikte kullanarak grafik resim dosyalarında işlem 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ı geçici bir Cloud Functions örneğinizdeki dizin. Bu konumda, dosyayı gerektiği gibi işleyebilir ve ardından Cloud Storage'e yükleyebilirsiniz. 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 konumuna geri dön.