محرک های ذخیره سازی ابری


می‌توانید عملکردی را در پاسخ به آپلود، به‌روزرسانی یا حذف فایل‌ها و پوشه‌ها در Cloud Storage فعال کنید.

نمونه‌های موجود در این صفحه بر اساس یک تابع نمونه است که هنگام آپلود فایل‌های تصویری در فضای ذخیره‌سازی ابری فعال می‌شود. این تابع نمونه نحوه دسترسی به ویژگی‌های رویداد، نحوه بارگیری یک فایل در نمونه توابع ابری و دیگر اصول مدیریت رویدادهای 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

محدوده یک تابع ذخیره سازی ابری

از الگوی زیر استفاده کنید تا عملکرد خود را به یک سطل فضای ذخیره سازی ابری اختصاص دهید و هر گزینه دلخواه را تنظیم کنید:

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]):
    # ...

مکان عملکرد را تنظیم کنید

عدم تطابق بین مکان ها می تواند منجر به شکست استقرار شود. همچنین، فاصله بین مکان یک سطل ذخیره‌سازی ابری و محل عملکرد می‌تواند تأخیر قابل توجهی در شبکه ایجاد کند. برای جلوگیری از این شرایط، مکان عملکرد را به گونه‌ای مشخص کنید که به یکی از روش‌های زیر با مکان سطل/تریگر مطابقت داشته باشد:

  • محل عملکرد همان مکان ماشه است
  • مکان عملکرد در داخل محل ماشه است (زمانی که منطقه ماشه دو یا چند ناحیه است)
  • اگر ناحیه ماشه روی us-central1 تنظیم شده باشد، عملکرد ممکن است در هر مکانی باشد

رویدادهای 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، باید فایل ها را در نمونه توابع دانلود کنید، یعنی ماشین مجازی که کد شما را اجرا می کند.

با استفاده از توابع ابری همراه با برنامه‌های پردازش تصویر مانند 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 خود دانلود کنید. در این مکان می توانید فایل را در صورت نیاز پردازش کرده و سپس در فضای ذخیره سازی ابری آپلود کنید. هنگام انجام کارهای ناهمزمان، مطمئن شوید که در تماس پاسخگوی خود یک وعده جاوا اسکریپت را برمی گردانید.

پایتون

@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 بارگذاری می کند.