محرک‌های Cloud Storage (نسل اول)

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

مثال‌های این صفحه براساس تابع نمونه‌ای است که وقتی فایل‌های تصویری در Cloud Storage بارگذاری می‌شوند راه‌اندازی می‌شود. این تابع نمونه نشان می‌دهد چگونه به مشخصه‌های رویداد دسترسی پیدا کنید، چگونه فایلی را در نمونه Cloud Functions بارگیری کنید، و دیگر اصول مدیریت رویدادهای Cloud Storage.

برای مثال‌های بیشتر از موارد استفاده، با Cloud Functions چه کارهایی می‌توانم انجام دهم؟ را ببینید.

راه‌اندازی تابع در تغییرات Cloud Storage

از functions.storage برای ایجاد تابعی استفاده کنید که رویدادهای Cloud Storage را مدیریت می‌کند. بسته به اینکه می‌خواهید تابع خود را به یک دسته Cloud Storage خاص محدود کنید یا از دسته پیش‌فرض استفاده کنید، از یکی از موارد زیر استفاده کنید:

برای مثال، نمونه تولیدکننده ریزعکس به محدوده پیش‌فرض برای پروژه محدود شده است:

exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => {
  // ...
});

‫Cloud Storage از این رویدادها پشتیبانی می‌کند:

  • onArchive فقط زمانی ارسال می‌شود که سطل نسخه‌بندی شیء را فعال کرده باشد. این رویداد نشان می‌دهد که نسخه زنده یک شیء به نسخه بایگانی‌شده تبدیل شده است، یا به این دلیل که بایگانی شده است یا به این دلیل که با بارگذاری شیء دیگری با همان نام بازنویسی شده است.
  • onDelete وقتی ارسال می‌شود که شیء برای همیشه حذف شده باشد. این شامل اشیایی می‌شود که رونویسی شده‌اند یا به‌عنوان بخشی از پیکربندی چرخه حیات دسته حذف شده‌اند. برای دسته‌هایی که نسخه‌بندی شیء در آن‌ها فعال است، وقتی شیء بایگانی می‌شود (onArchive را ببینید)، این مورد ارسال نمی‌شود، حتی اگر بایگانی ازطریق روش storage.objects.delete انجام شود.
  • onFinalize وقتی شیء جدیدی (یا نسل جدیدی از شیء موجود) با موفقیت در دسته ایجاد شود، ارسال می‌شود. این شامل کپی کردن یا بازنویسی شیء موجود می‌شود. بارگذاری ناموفق این رویداد را راه‌اندازی نمی‌کند.
  • onMetadataUpdate وقتی فراداده شیء موجودی تغییر می‌کند ارسال می‌شود.

رویداد را در کنترل‌کننده رویداد on همان‌طور که در بالا برای onFinalize نشان داده شده است تنظیم کنید.

دسترسی به مشخصه‌های شیء Cloud Storage

Cloud Functions تعدادی از مشخصه‌های شیء Cloud Storage را برای فایل به‌روزشده نشان می‌دهد، مانند size و contentType. هرگاه تغییری در فراداده شیء ایجاد شود، مشخصه «metageneration» افزایش می‌یابد. برای اشیای جدید، مقدار metageneration برابر با 1 است.

const fileBucket = object.bucket; // The Storage bucket that contains the file.
const filePath = object.name; // File path in the bucket.
const contentType = object.contentType; // File content type.

نمونه تولید ریزعکس از برخی‌از این مشخصه‌ها برای شناسایی موارد خروج که در آن تابع برمی‌گردد استفاده می‌کند:

// Exit if this is triggered on a file that is not an image.
if (!contentType.startsWith('image/')) {
  return functions.logger.log('This is not an image.');
}

// Get the file name.
const fileName = path.basename(filePath);
// Exit if the image is already a thumbnail.
if (fileName.startsWith('thumb_')) {
  return functions.logger.log('Already a Thumbnail.');
}

بارگیری، تبدیل، و بارگذاری فایل

در برخی موارد، ممکن است لازم نباشد فایل‌ها را از Cloud Storage بارگیری کنید. بااین‌حال، برای انجام کارهای فشرده مانند تولید تصویر کوچک از فایلی که در Cloud Storage ذخیره شده است، باید فایل‌ها را در نمونه توابع بارگیری کنید—یعنی ماشین مجازی که کد شما را اجرا می‌کند.

برای بارگیری و بارگذاری مجدد آسان اشیاء در Cloud Storage، بسته Google Cloud Storage را بااستفاده از npm install --save @google-cloud/storage نصب کنید و آن را وارد کنید. برای استفاده از JavaScript promises برای مدیریت فرایندهای خارجی مثل تکالیف پردازش ریزعکس در نمونه، child-process-promise را نیز وارد کنید:

const functions = require('firebase-functions/v1');
const { initializeApp } = require('firebase-admin/app');
const { getStorage } = require('firebase-admin/storage');
initializeApp();
const path = require('path');

//library for resizing images
const sharp = /** @type {typeof import('sharp')} */ (require('sharp'));

از gcs.bucket.file(filePath).download برای بارگیری فایل در دایرکتوری موقت در نمونه Cloud Functions استفاده کنید. در این مکان، می‌توانید فایل را درصورت نیاز پردازش کنید و سپس در Cloud Storage بارگذاری کنید. هنگام انجام کارهای ناهمگام، مطمئن شوید که یک JavaScript promise در فراخوانی برگشتی‌تان برمی‌گردانید.

مثال: تبدیل تصویر

بااستفاده از Cloud Functions به‌همراه برنامه‌های پردازش تصویر مثل sharp، می‌توانید فایل‌های تصویری گرافیکی را دستکاری کنید. در زیر نمونه‌ای از نحوه ایجاد تصویر کوچک برای فایل تصویری بارگذاری‌شده آورده شده است:

// Download file from bucket.
const bucket = getStorage().bucket(fileBucket);
const metadata = {
  contentType: contentType,
};
const downloadResponse = await bucket.file(filePath).download();
const imageBuffer = downloadResponse[0];
functions.logger.log("Image downloaded!");

// Generate a thumbnail using sharp.
const thumbnailBuffer = await sharp(imageBuffer).resize({
  width: 200,
  height: 200,
  withoutEnlargement: true,
}).toBuffer();
functions.logger.log("Thumbnail created");

// Upload the thumbnail with a 'thumb_' prefix.
const thumbFileName = `thumb_${fileName}`;
const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);
await bucket.file(thumbFilePath).save(thumbnailBuffer, {
  metadata: metadata,
});
return functions.logger.log("Thumbnail uploaded!");

این کد یک ریزعکس ۲۰۰×۲۰۰ برای تصویر ذخیره‌شده در دایرکتوری موقت ایجاد می‌کند، سپس آن را دوباره در Cloud Storage بارگذاری می‌کند.

کاوش کردن نمونه‌های بیشتر

نمونه‌های بیشتری از عملکردهای رایج تبدیل رسانه ازجمله تراتبدیل تصاویر، مدیریت محتوا، استخراج فراداده EXIF. فهرست کامل مثال‌ها در GitHub دردسترس است.