Cloud Storage ট্রিগার (ফার্স্ট জেনারেশন)

Cloud Storage-এ ফাইল ও ফোল্ডার আপলোড, আপডেট বা মুছে ফেলার প্রতিক্রিয়া হিসেবে আপনি কোনও ফাংশন ট্রিগার করতে পারবেন।

এই পৃষ্ঠার উদাহরণগুলি একটি স্যাম্পেল ফাংশনের উপর ভিত্তি করে তৈরি করা হয়েছে যা Cloud Storage-এ ছবির ফাইল আপলোড করার সময় ট্রিগার করে। এই স্যাম্পেল ফাংশন দেখায় যে কীভাবে ইভেন্ট অ্যাট্রিবিউট অ্যাক্সেস করতে হয়, কীভাবে Cloud Functions ইনস্ট্যান্সে ফাইল ডাউনলোড করতে হয় এবং Cloud Storage ইভেন্ট ম্যানেজ করার অন্যান্য মৌলিক বিষয়।

ব্যবহারের আরও উদাহরণ দেখতে, আমি Cloud Functions-এর মাধ্যমে কী করতে পারি? দেখুন

Cloud Storage-এ পরিবর্তন হলে ফাংশন ট্রিগার করুন

Cloud Storage ইভেন্ট ম্যানেজ করে এমন ফাংশন তৈরি করতে functions.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' অ্যাট্রিবিউট বৃদ্ধি পায়। নতুন অবজেক্টের জন্য, 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-এ অবজেক্ট সহজে ডাউনলোড ও আবার আপলোড করতে, npm install --save @google-cloud/storage ব্যবহার করে 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'));

আপনার Cloud Functions ইনস্ট্যান্সের সাময়িক ডিরেক্টরিতে ফাইল ডাউনলোড করতে gcs.bucket.file(filePath).download ব্যবহার করুন। এই লোকেশনে, আপনি প্রয়োজন অনুযায়ী ফাইল প্রসেস করে 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!");

এই কোডটি সাময়িক ডিরেক্টরিতে সেভ করা ছবির জন্য একটি ২০০x২০০ থাম্বনেল তৈরি করে, তারপর এটি Cloud Storage-এ আপলোড করে।

আরও উদাহরণ এক্সপ্লোর করুন

সাধারণ মিডিয়া ট্রান্সফর্মেশন ফাংশনের আরও উদাহরণ, যার মধ্যে রয়েছে ইমেজ ট্রান্সকোড করা, কন্টেন্ট মডারেট করা, EXIF মেটাডেটা এক্সট্র্যাক্ট করা। উদাহরণের সম্পূর্ণ তালিকা GitHub-এ উপলভ্য।