توسيع نطاق التخزين في السحابة الإلكترونية باستخدام وظائف السحابة الإلكترونية


يمكنك بدء وظيفة استجابةً لتحميل الملفات والمجلدات أو تعديلها أو حذفها في 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 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. عند تنفيذ المهام غير المتزامنة، تأكَّد من عرض وعد JavaScript في دالتك المرجعية.

مثال: تحويل الصور

باستخدام 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!");

تُنشئ هذه التعليمة البرمجية صورة مصغّرة بحجم 200×200 للصورة المحفوظة في دليل مؤقت، ثم تحمّلها مجددًا إلى Cloud Storage.

استكشاف المزيد من الأمثلة

مزيد من الأمثلة على دوال تحويل الوسائط الشائعة، بما في ذلك تحويل ترميز الصور، الإشراف على المحتوى، استخراج البيانات الوصفية EXIF يمكنك الاطّلاع على القائمة الكاملة بالأمثلة على GitHub.