您可以根據 Cloud Storage 中檔案和資料夾的上傳、更新或刪除作業,觸發函式。
本頁的範例是以範例函式為基礎,該函式會在圖片檔案上傳至 Cloud Storage 時觸發。這個範例函式示範如何存取事件屬性、如何將檔案下載至 Cloud Functions 例項,以及處理 Cloud Storage 事件的其他基本概念。
如需更多用途範例,請參閱「Cloud Functions 提供哪些功能?」
在 Cloud Storage 變更時觸發函式
使用 functions.storage
建立可處理 Cloud Storage 事件的函式。視您是否要將函式範圍限定為特定 Cloud Storage 值區,或是使用預設值區,而決定使用下列哪一個函式:
functions.storage.object()
可監聽預設 Cloud Storage 值區中的物件變更。functions.storage.bucket('bucketName').object()
可監聽特定值區中的物件變更。
舉例來說,縮圖產生器範例的範圍是專案的預設值區:
exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => { // ... });
Cloud Storage 支援下列事件:
onArchive
只會在值區已啟用物件版本管理時傳送事件。這個事件表示物件的使用中版本已變為封存版本,原因是物件遭到封存或是因為擁有相同名稱的物件上傳而遭到覆寫。onDelete
當永久刪除物件時,會傳送這個事件。這包含值區生命週期設定中覆寫或刪除的物件。如果值區已啟用物件版本管理功能,則系統在封存物件時,不會傳送事件 (即使透過storage.objects.delete
方法進行封存也不會傳送),詳情請參閱onArchive
說明。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,請使用 npm install --save @google-cloud/storage
安裝 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 承諾。
示例:圖片轉換
您可以將 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 x 200 縮圖,然後將其上傳回 Cloud Storage。
查看更多範例
其他常見的媒體轉換函式範例包括轉碼圖片、管理內容、擷取 EXIF 中繼資料。您可以在 GitHub 上查看完整範例清單。