ক্লাউড স্টোরেজ ট্রিগার


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

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

প্রয়োজনীয় মডিউল আমদানি করুন

শুরু করতে, ক্লাউড স্টোরেজ ইভেন্টগুলি পরিচালনা করার জন্য প্রয়োজনীয় মডিউলটি আমদানি করুন:

Node.js

 const {onObjectFinalized} = require("firebase-functions/v2/storage");

পাইথন

 from firebase_functions import storage_fn

সম্পূর্ণ নমুনা তৈরি করতে, Firebase অ্যাডমিন SDK এবং ইমেজ প্রসেসিং টুলগুলির জন্য নির্ভরতা যোগ করুন:

Node.js

 const {initializeApp} = require("firebase-admin/app");
const {getStorage} = require("firebase-admin/storage");
const logger = require("firebase-functions/logger");
const path = require("path");

// library for image resizing
const sharp = require("sharp");

initializeApp();

পাইথন

 import io
import pathlib

from PIL import Image

from firebase_admin import initialize_app

initialize_app()
from firebase_admin import storage

একটি ক্লাউড স্টোরেজ ফাংশন স্কোপ করুন

একটি নির্দিষ্ট ক্লাউড স্টোরেজ বালতিতে আপনার ফাংশন স্কোপ করতে নিম্নলিখিত প্যাটার্নটি ব্যবহার করুন এবং যেকোনো পছন্দসই বিকল্প সেট করুন:

Node.js

// scope handler to a specific bucket, using storage options parameter
export archivedopts = onObjectArchived({ bucket: "myBucket" }, (event) => {
  //…
});

পাইথন

# Scope handler to a specific bucket using storage options parameter
@storage_fn.on_object_archived(bucket="myBucket")
def archived_bucket(event: storage_fn.CloudEvent[storage_fn.StorageObjectData]):
    # ...

বিপরীতে, উদাহরণ থাম্বনেল জেনারেটর ফাংশন প্রকল্পের জন্য ডিফল্ট বালতিতে স্কোপ করা হয়েছে:

Node.js

exports.generateThumbnail = onObjectFinalized({cpu: 2}, async (event) => {
// ...
});

পাইথন

@storage_fn.on_object_archived()
def generatethumbnail(event: storage_fn.CloudEvent[storage_fn.StorageObjectData]):
    # ...

ফাংশন অবস্থান সেট করুন

অবস্থানের মধ্যে অমিলের ফলে স্থাপনা ব্যর্থ হতে পারে। এছাড়াও, ক্লাউড স্টোরেজ বাকেটের অবস্থান এবং ফাংশনের অবস্থানের মধ্যে দূরত্ব উল্লেখযোগ্য নেটওয়ার্ক লেটেন্সি তৈরি করতে পারে। এই পরিস্থিতিগুলি এড়াতে, ফাংশন অবস্থান নির্দিষ্ট করুন যাতে এটি এই উপায়গুলির মধ্যে একটিতে বালতি/ট্রিগার অবস্থানের সাথে মেলে:

  • ফাংশন অবস্থান ট্রিগার অবস্থান হিসাবে একই
  • ফাংশন অবস্থান ট্রিগার অবস্থানের ভিতরে (যখন ট্রিগার অঞ্চল দ্বৈত/মাল্টি অঞ্চল হয়)
  • ট্রিগার অঞ্চলটি us-central1 এ সেট করা থাকলে ফাংশন যেকোন অবস্থানে হতে পারে

ক্লাউড স্টোরেজ ইভেন্টগুলি পরিচালনা করুন

ক্লাউড স্টোরেজ ইভেন্টগুলিতে প্রতিক্রিয়া জানাতে এই হ্যান্ডলারগুলি উপলব্ধ:

Node.js

  • onObjectArchived শুধুমাত্র তখনই পাঠানো হয় যখন একটি বালতি অবজেক্ট সংস্করণ সক্ষম করে। এই ইভেন্টটি নির্দেশ করে যে একটি বস্তুর লাইভ সংস্করণ একটি সংরক্ষণাগারভুক্ত সংস্করণে পরিণত হয়েছে, কারণ এটি সংরক্ষণাগারভুক্ত ছিল বা একই নামের একটি বস্তুর আপলোড দ্বারা এটি ওভাররাইট করা হয়েছে৷
  • onObjectDeleted পাঠানো হয় যখন একটি বস্তু স্থায়ীভাবে মুছে ফেলা হয়। এর মধ্যে এমন বস্তু অন্তর্ভুক্ত রয়েছে যা ওভাররাইট করা হয়েছে বা বাকেটের জীবনচক্র কনফিগারেশনের অংশ হিসেবে মুছে ফেলা হয়েছে। অবজেক্ট সংস্করণ সক্ষম করা বালতিগুলির জন্য, যখন কোনও বস্তু সংরক্ষণাগারভুক্ত করা হয় তখন এটি পাঠানো হয় না (দেখুন onArchive ), এমনকি সংরক্ষণাগারটি storage.objects.delete পদ্ধতির মাধ্যমে ঘটলেও৷
  • onObjectFinalized পাঠানো হয় যখন একটি নতুন অবজেক্ট (বা একটি বিদ্যমান বস্তুর একটি নতুন প্রজন্ম) সফলভাবে বালতিতে তৈরি করা হয়। এটি একটি বিদ্যমান বস্তু অনুলিপি বা পুনর্লিখন অন্তর্ভুক্ত. একটি ব্যর্থ আপলোড এই ইভেন্ট ট্রিগার না.
  • onMetadataUpdated পাঠানো হয় যখন একটি বিদ্যমান বস্তুর মেটাডেটা পরিবর্তিত হয়।

পাইথন

  • on_object_archived শুধুমাত্র তখনই পাঠানো হয় যখন একটি বালতি অবজেক্ট সংস্করণ সক্ষম করে। এই ইভেন্টটি নির্দেশ করে যে একটি বস্তুর লাইভ সংস্করণ একটি সংরক্ষণাগারভুক্ত সংস্করণে পরিণত হয়েছে, কারণ এটি সংরক্ষণাগারভুক্ত ছিল বা একই নামের একটি বস্তুর আপলোড দ্বারা এটি ওভাররাইট করা হয়েছে৷
  • on_object_deleted একটি বস্তু স্থায়ীভাবে মুছে ফেলা হলে পাঠানো হয়। এর মধ্যে এমন বস্তু অন্তর্ভুক্ত রয়েছে যা ওভাররাইট করা হয়েছে বা বাকেটের জীবনচক্র কনফিগারেশনের অংশ হিসেবে মুছে ফেলা হয়েছে। অবজেক্ট সংস্করণ সক্ষম করা বালতিগুলির জন্য, যখন কোনও বস্তু সংরক্ষণাগারভুক্ত করা হয় তখন এটি পাঠানো হয় না (দেখুন onArchive ), এমনকি সংরক্ষণাগারটি storage.objects.delete পদ্ধতির মাধ্যমে ঘটলেও৷
  • on_object_finalized যখন একটি নতুন অবজেক্ট (বা বিদ্যমান বস্তুর একটি নতুন প্রজন্ম) সফলভাবে বালতিতে তৈরি করা হয় তখন পাঠানো হয়। এটি একটি বিদ্যমান বস্তু অনুলিপি বা পুনর্লিখন অন্তর্ভুক্ত. একটি ব্যর্থ আপলোড এই ইভেন্ট ট্রিগার না.
  • on_metadata_updated একটি বিদ্যমান বস্তুর মেটাডেটা পরিবর্তিত হলে পাঠানো হয়।

ক্লাউড স্টোরেজ অবজেক্ট অ্যাট্রিবিউট অ্যাক্সেস করুন

ক্লাউড ফাংশন অনেকগুলি ক্লাউড স্টোরেজ অবজেক্টের বৈশিষ্ট্যগুলিকে প্রকাশ করে যেমন অবজেক্টের আকার এবং আপডেট করা ফাইলের জন্য সামগ্রীর ধরন৷ যখনই অবজেক্টের মেটাডেটাতে কোনো পরিবর্তন হয় তখন metageneration অ্যাট্রিবিউট বাড়ানো হয়। নতুন বস্তুর জন্য, metageneration মান হল 1

Node.js

const fileBucket = event.data.bucket; // Storage bucket containing the file.
const filePath = event.data.name; // File path in the bucket.
const contentType = event.data.contentType; // File content type.

পাইথন

bucket_name = event.data.bucket
file_path = pathlib.PurePath(event.data.name)
content_type = event.data.content_type

থাম্বনেইল জেনারেশন নমুনা এই বৈশিষ্ট্যগুলির কিছু ব্যবহার করে এক্সিট কেস সনাক্ত করতে যেখানে ফাংশনটি ফিরে আসে:

Node.js

// Exit if this is triggered on a file that is not an image.
if (!contentType.startsWith("image/")) {
  return logger.log("This is not an image.");
}
// Exit if the image is already a thumbnail.
const fileName = path.basename(filePath);
if (fileName.startsWith("thumb_")) {
  return logger.log("Already a Thumbnail.");
}

পাইথন

# Exit if this is triggered on a file that is not an image.
if not content_type or not content_type.startswith("image/"):
    print(f"This is not an image. ({content_type})")
    return

# Exit if the image is already a thumbnail.
if file_path.name.startswith("thumb_"):
    print("Already a thumbnail.")
    return

ডাউনলোড করুন, রূপান্তর করুন এবং একটি ফাইল আপলোড করুন

কিছু ক্ষেত্রে, ক্লাউড স্টোরেজ থেকে ফাইল ডাউনলোড করার প্রয়োজন নাও হতে পারে। যাইহোক, ক্লাউড স্টোরেজে সঞ্চিত একটি ফাইল থেকে থাম্বনেইল ইমেজ তৈরি করার মতো নিবিড় কাজগুলি করতে, আপনাকে ফাংশন ইনস্ট্যান্সে ফাইলগুলি ডাউনলোড করতে হবে-অর্থাৎ, ভার্চুয়াল মেশিন যা আপনার কোড চালায়।

Node.js এর জন্য sharp এবং পাইথনের জন্য পিলোর মত ইমেজ-প্রসেসিং প্রোগ্রামগুলির সাথে একসাথে ক্লাউড ফাংশন ব্যবহার করে, আপনি গ্রাফিকাল ইমেজ ফাইলগুলিতে ম্যানিপুলেশন করতে পারেন। একটি আপলোড করা ইমেজ ফাইলের জন্য একটি থাম্বনেইল ইমেজ কিভাবে তৈরি করতে হয় তার একটি উদাহরণ নিচে দেওয়া হল:

Node.js

/**
 * When an image is uploaded in the Storage bucket,
 * generate a thumbnail automatically using sharp.
 */
exports.generateThumbnail = onObjectFinalized({cpu: 2}, async (event) => {

  const fileBucket = event.data.bucket; // Storage bucket containing the file.
  const filePath = event.data.name; // File path in the bucket.
  const contentType = event.data.contentType; // File content type.

  // Exit if this is triggered on a file that is not an image.
  if (!contentType.startsWith("image/")) {
    return logger.log("This is not an image.");
  }
  // Exit if the image is already a thumbnail.
  const fileName = path.basename(filePath);
  if (fileName.startsWith("thumb_")) {
    return logger.log("Already a Thumbnail.");
  }

  // Download file into memory from bucket.
  const bucket = getStorage().bucket(fileBucket);
  const downloadResponse = await bucket.file(filePath).download();
  const imageBuffer = downloadResponse[0];
  logger.log("Image downloaded!");

  // Generate a thumbnail using sharp.
  const thumbnailBuffer = await sharp(imageBuffer).resize({
    width: 200,
    height: 200,
    withoutEnlargement: true,
  }).toBuffer();
  logger.log("Thumbnail created");

  // Prefix 'thumb_' to file name.
  const thumbFileName = `thumb_${fileName}`;
  const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);

  // Upload the thumbnail.
  const metadata = {contentType: contentType};
  await bucket.file(thumbFilePath).save(thumbnailBuffer, {
    metadata: metadata,
  });
  return logger.log("Thumbnail uploaded!");
});

আপনার ক্লাউড ফাংশন ইনস্ট্যান্সে একটি অস্থায়ী ডিরেক্টরিতে ফাইলটি ডাউনলোড করুন। এই অবস্থানে, আপনি প্রয়োজন অনুসারে ফাইলটি প্রক্রিয়া করতে পারেন এবং তারপরে ক্লাউড স্টোরেজে আপলোড করতে পারেন। অ্যাসিঙ্ক্রোনাস কাজ সম্পাদন করার সময়, নিশ্চিত করুন যে আপনি আপনার কলব্যাকে একটি জাভাস্ক্রিপ্ট প্রতিশ্রুতি ফেরত দিয়েছেন।

পাইথন

@storage_fn.on_object_finalized()
def generatethumbnail(event: storage_fn.CloudEvent[storage_fn.StorageObjectData]):
    """When an image is uploaded in the Storage bucket, generate a thumbnail
    automatically using Pillow."""

    bucket_name = event.data.bucket
    file_path = pathlib.PurePath(event.data.name)
    content_type = event.data.content_type

    # Exit if this is triggered on a file that is not an image.
    if not content_type or not content_type.startswith("image/"):
        print(f"This is not an image. ({content_type})")
        return

    # Exit if the image is already a thumbnail.
    if file_path.name.startswith("thumb_"):
        print("Already a thumbnail.")
        return

    bucket = storage.bucket(bucket_name)

    image_blob = bucket.blob(str(file_path))
    image_bytes = image_blob.download_as_bytes()
    image = Image.open(io.BytesIO(image_bytes))

    image.thumbnail((200, 200))
    thumbnail_io = io.BytesIO()
    image.save(thumbnail_io, format="png")
    thumbnail_path = file_path.parent / pathlib.PurePath(f"thumb_{file_path.stem}.png")
    thumbnail_blob = bucket.blob(str(thumbnail_path))
    thumbnail_blob.upload_from_string(thumbnail_io.getvalue(), content_type="image/png")

এই কোডটি একটি অস্থায়ী ডিরেক্টরিতে সংরক্ষিত ছবির জন্য একটি 200x200 থাম্বনেইল তৈরি করে, তারপর এটিকে ক্লাউড স্টোরেজে আবার আপলোড করে।