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

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

بااستفاده از 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 دردسترس است.