راه‌اندازهای ذخیره‌سازی ابری (نسل اول)

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

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

دسترسی به ویژگی‌های شیء Cloud Storage

Cloud Functions تعدادی از ویژگی‌های شیء Cloud Storage مانند size و contentType را برای فایل به‌روزرسانی‌شده نمایش می‌دهند. ویژگی «فراداده» هر زمان که تغییری در فراداده شیء ایجاد شود، افزایش می‌یابد. برای اشیاء جدید، مقدار 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 نصب کرده و آن را وارد کنید. برای استفاده از promise های جاوا اسکریپت برای مدیریت فرآیندهای خارجی مانند وظایف پردازش تصاویر بندانگشتی در نمونه، child-process-promise نیز وارد کنید:

const functions = require('firebase-functions/v1');
const admin = require('firebase-admin');
admin.initializeApp()
const path = require('path');

//library for resizing images
const sharp = require('sharp');

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

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

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

// Download file from bucket.
const bucket = admin.storage().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!");

این کد یک تصویر کوچک ۲۰۰x۲۰۰ برای تصویر ذخیره شده در یک دایرکتوری موقت ایجاد می‌کند، سپس آن را دوباره به Cloud Storage آپلود می‌کند.

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

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