הרחבת אחסון בענן עם פונקציות ענן


אתה יכול להפעיל פונקציה בתגובה להעלאה, עדכון או מחיקה של קבצים ותיקיות ב-Cloud Storage.

דוגמאות בדף זה מבוססות על פונקציה לדוגמה המופעלת כאשר קבצי תמונה מועלים ל-Cloud Storage. פונקציה לדוגמה זו מדגימה כיצד לגשת לתכונות אירוע, כיצד להוריד קובץ למופע של Cloud Functions, ועקרונות יסוד אחרים של טיפול באירועי Cloud Storage.

לדוגמאות נוספות של מקרי שימוש, ראה מה אני יכול לעשות עם פונקציות ענן?

הפעל פונקציה בשינויים ב-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 הוא 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 בהתקשרות חזרה.

דוגמה: שינוי תמונה

באמצעות פונקציות ענן יחד עם תוכנות עיבוד תמונה כמו 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!");

קוד זה יוצר תמונה ממוזערת בגודל 200x200 עבור התמונה שנשמרה בספרייה זמנית, ולאחר מכן מעלה אותה בחזרה ל-Cloud Storage.

חקור דוגמאות נוספות

דוגמאות נוספות לפונקציות נפוצות של טרנספורמציה של מדיה, כולל שינוי קידוד תמונות , ניהול תוכן , חילוץ מטא נתונים של EXIF . רשימת הדוגמאות המלאה זמינה ב-GitHub.