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


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

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

استخدام 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.