Firebase is back at Google I/O on May 10! Register now

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

קל לארגן דפים בעזרת אוספים אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.

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

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

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

הפעל פונקציה בשינויים ב-Cloud Storage

השתמש functions.storage כדי ליצור פונקציה המטפלת באירועי Cloud Storage. תלוי אם ברצונך להגדיר את הפונקציה שלך לדלי ספציפי של Cloud Storage או להשתמש בדלי ברירת המחדל, השתמש באחת מהאפשרויות הבאות:

לדוגמה, הדגימה של מחולל התמונות הממוזערות היא בהיקף של דלי ברירת המחדל עבור הפרויקט:

exports.generateThumbnail = 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.
const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.

מדגם יצירת התמונות הממוזערות משתמש בכמה מהתכונות הללו כדי לזהות מקרי יציאה שבהם הפונקציה מחזירה:

// 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');
const admin = require('firebase-admin');
admin.initializeApp()
const spawn = require('child-process-promise').spawn;
const path = require('path');
const os = require('os');
const fs = require('fs');

השתמש ב- gcs.bucket.file(filePath).download כדי להוריד קובץ לספרייה זמנית במופע Cloud Functions שלך. במיקום זה, תוכל לעבד את הקובץ לפי הצורך ולאחר מכן להעלות ל-Cloud Storage. בעת ביצוע משימות אסינכרוניות, ודא שאתה מחזיר הבטחת JavaScript בהתקשרות חזרה.

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

Cloud Functions מספקת תוכנת עיבוד תמונה בשם ImageMagick שיכולה לבצע מניפולציות על קבצי תמונה גרפיים. להלן דוגמה כיצד ליצור תמונה ממוזערת עבור קובץ תמונה שהועלה:

// Download file from bucket.
const bucket = admin.storage().bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
const metadata = {
  contentType: contentType,
};
await bucket.file(filePath).download({destination: tempFilePath});
functions.logger.log('Image downloaded locally to', tempFilePath);
// Generate a thumbnail using ImageMagick.
await spawn('convert', [tempFilePath, '-thumbnail', '200x200>', tempFilePath]);
functions.logger.log('Thumbnail created at', tempFilePath);
// We add a 'thumb_' prefix to thumbnails file name. That's where we'll upload the thumbnail.
const thumbFileName = `thumb_${fileName}`;
const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);
// Uploading the thumbnail.
await bucket.upload(tempFilePath, {
  destination: thumbFilePath,
  metadata: metadata,
});
// Once the thumbnail has been uploaded delete the local file to free up disk space.
return fs.unlinkSync(tempFilePath);

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

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

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

עיין בתיעוד המלא של ההפעלה של Google Cloud Storage למידע נוסף.