میتوانید عملکردی را در پاسخ به آپلود، بهروزرسانی یا حذف فایلها و پوشهها در Cloud Storage فعال کنید.
نمونههای موجود در این صفحه بر اساس یک تابع نمونه است که هنگام آپلود فایلهای تصویری در Cloud Storage فعال میشود. این تابع نمونه نحوه دسترسی به ویژگیهای رویداد، نحوه بارگیری یک فایل در نمونه Cloud Functions و دیگر اصول مدیریت رویدادهای Cloud Storage را نشان میدهد.
ماژول های مورد نیاز را وارد کنید
برای شروع، ماژول مورد نیاز برای مدیریت رویدادهای Cloud Storage را وارد کنید:
Node.js
const {onObjectFinalized} = require("firebase-functions/v2/storage");
پایتون
from firebase_functions import storage_fn
برای ساختن نمونه کامل، وابستگیهای Firebase Admin SDK و ابزارهای پردازش تصویر را نیز اضافه کنید:
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();
پایتون
import io
import pathlib
from PIL import Image
from firebase_admin import initialize_app
initialize_app()
from firebase_admin import storage
محدوده یک تابع Cloud Storage
از الگوی زیر استفاده کنید تا عملکرد خود را به یک سطل Cloud Storage اختصاص دهید و هر گزینه دلخواه را تنظیم کنید:
Node.js
// scope handler to a specific bucket, using storage options parameter
export archivedopts = onObjectArchived({ bucket: "myBucket" }, (event) => {
//…
});
پایتون
# 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]):
# ...
در مقابل، تابع مثال مولد تصویر کوچک به سطل پیشفرض پروژه اختصاص دارد:
Node.js
exports.generateThumbnail = onObjectFinalized({cpu: 2}, async (event) => { // ... });
پایتون
@storage_fn.on_object_archived()
def generatethumbnail(event: storage_fn.CloudEvent[storage_fn.StorageObjectData]):
# ...
مکان عملکرد را تنظیم کنید
عدم تطابق بین مکان ها می تواند منجر به شکست استقرار شود. همچنین، فاصله بین مکان یک سطل Cloud Storage و محل عملکرد میتواند تأخیر قابل توجهی در شبکه ایجاد کند. برای جلوگیری از این شرایط، مکان عملکرد را به گونهای مشخص کنید که به یکی از روشهای زیر با مکان سطل/تریگر مطابقت داشته باشد:
- محل عملکرد همان مکان ماشه است
- مکان عملکرد در داخل محل ماشه است (زمانی که منطقه ماشه دو یا چند ناحیه است)
- اگر ناحیه ماشه روی
us-central1
تنظیم شده باشد، عملکرد ممکن است در هر مکانی باشد
رویدادهای Cloud Storage را مدیریت کنید
این دستهها برای پاسخگویی به رویدادهای Cloud Storage در دسترس هستند:
Node.js
-
onObjectArchived
فقط زمانی ارسال میشود که یک سطل نسخهسازی شی را فعال کرده باشد. این رویداد نشان می دهد که نسخه زنده یک شی به یک نسخه بایگانی شده تبدیل شده است، یا به این دلیل که بایگانی شده است یا به این دلیل که با آپلود یک شی به همین نام رونویسی شده است. -
onObjectDeleted
زمانی ارسال می شود که یک شی به طور دائم حذف شود. این شامل اشیایی است که به عنوان بخشی از پیکربندی چرخه حیات سطل بازنویسی شده یا حذف شده اند. برای سطلهایی که نسخهبندی شی فعال است، هنگامی که یک شی بایگانی میشود، این مورد ارسال نمیشود (بهonArchive
مراجعه کنید)، حتی اگر بایگانیسازی از طریق روشstorage.objects.delete
انجام شود. -
onObjectFinalized
زمانی ارسال می شود که یک شی جدید (یا یک نسل جدید از یک شی موجود) با موفقیت در سطل ایجاد شود. این شامل کپی یا بازنویسی یک شی موجود است. آپلود ناموفق این رویداد را راه اندازی نمی کند. -
onMetadataUpdated
زمانی ارسال می شود که ابرداده یک شی موجود تغییر کند.
پایتون
-
on_object_archived
فقط زمانی ارسال میشود که یک سطل نسخهسازی شی را فعال کرده باشد. این رویداد نشان می دهد که نسخه زنده یک شی به یک نسخه بایگانی شده تبدیل شده است، یا به این دلیل که بایگانی شده است یا به این دلیل که با آپلود یک شی به همین نام رونویسی شده است. -
on_object_deleted
زمانی ارسال می شود که یک شی برای همیشه حذف شده باشد. این شامل اشیایی است که به عنوان بخشی از پیکربندی چرخه حیات سطل بازنویسی شده یا حذف شده اند. برای سطلهایی که نسخهبندی شی فعال است، هنگامی که یک شی بایگانی میشود، این مورد ارسال نمیشود (بهonArchive
مراجعه کنید)، حتی اگر بایگانیسازی از طریق روشstorage.objects.delete
انجام شود. -
on_object_finalized
زمانی ارسال می شود که یک شی جدید (یا یک نسل جدید از یک شی موجود) با موفقیت در سطل ایجاد شود. این شامل کپی یا بازنویسی یک شی موجود است. آپلود ناموفق این رویداد را راه اندازی نمی کند. -
on_metadata_updated
زمانی ارسال می شود که ابرداده یک شی موجود تغییر کند.
دسترسی به ویژگیهای شیء Cloud Storage
Cloud Functions تعدادی از ویژگیهای شی Cloud Storage مانند اندازه شی و نوع محتوای آن را برای فایل بهروزرسانی شده در معرض نمایش میگذارد. هرگاه تغییری در ابرداده شیء ایجاد شود، ویژگی metageneration
افزایش مییابد. برای اشیاء جدید، مقدار metageneration
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.
پایتون
bucket_name = event.data.bucket
file_path = pathlib.PurePath(event.data.name)
content_type = event.data.content_type
نمونه تولید تصویر بندانگشتی از برخی از این ویژگی ها برای تشخیص موارد خروجی استفاده می کند که در آن تابع برمی گردد:
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."); }
پایتون
# 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
یک فایل را دانلود، تبدیل و آپلود کنید
در برخی موارد، ممکن است نیازی به دانلود فایلها از Cloud Storage نباشد. با این حال، برای انجام کارهای فشرده مانند تولید یک تصویر کوچک از یک فایل ذخیره شده در Cloud Storage ، باید فایلها را در نمونه توابع دانلود کنید، یعنی ماشین مجازی که کد شما را اجرا میکند.
با استفاده از Cloud Functions همراه با برنامههای پردازش تصویر مانند sharp
برای Node.js و Pillow برای پایتون، میتوانید روی فایلهای تصویری گرافیکی دستکاری انجام دهید. در زیر نمونه ای از نحوه ایجاد یک تصویر کوچک برای یک فایل تصویری آپلود شده آورده شده است:
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!");
});
فایل را در یک فهرست موقت در نمونه Cloud Functions خود دانلود کنید. در این مکان، میتوانید فایل را در صورت نیاز پردازش کرده و سپس در Cloud Storage آپلود کنید. هنگام انجام کارهای ناهمزمان، مطمئن شوید که در تماس پاسخگوی خود یک وعده جاوا اسکریپت را برمی گردانید.
پایتون
@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")
این کد یک تصویر کوچک 200x200 برای تصویر ذخیره شده در یک فهرست موقت ایجاد می کند، سپس آن را به Cloud Storage بارگذاری می کند.