میتوانید در پاسخ به بارگذاری، بهروزرسانی، یا حذف فایلها و پوشهها در Cloud Storage، تابعی را راهاندازی کنید.
مثالهای این صفحه براساس تابع نمونهای است که وقتی فایلهای تصویری در Cloud Storage بارگذاری میشوند راهاندازی میشود. این تابع نمونه نشان میدهد چگونه به مشخصههای رویداد دسترسی پیدا کنید، چگونه فایلی را در نمونه Cloud Functions بارگیری کنید، و دیگر اصول مدیریت رویدادهای Cloud Storage.
برای مثالهای بیشتر از موارد استفاده، با Cloud Functions چه کارهایی میتوانم انجام دهم؟ را ببینید.
راهاندازی تابع در تغییرات Cloud Storage
از functions.storage
برای ایجاد تابعی استفاده کنید که
رویدادهای Cloud Storage را مدیریت میکند. بسته به اینکه میخواهید تابع خود را به یک دسته Cloud Storage خاص محدود کنید یا از دسته پیشفرض استفاده کنید، از یکی از موارد زیر استفاده کنید:
functions.storage.object()برای گوش دادن به تغییرات شیء در دسته پیشفرض Cloud Storage.functions.storage.bucket('bucketName').object()برای گوش دادن به تغییرات شیء در یک دسته خاص.
برای مثال، نمونه تولیدکننده ریزعکس به محدوده پیشفرض برای پروژه محدود شده است:
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 دردسترس است.