您可以依據上傳、更新或 正在刪除「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
在永久刪除物件時傳送。這包含值區生命週期設定其中覆寫或刪除的物件。如果值區已啟用物件版本管理,則在封存物件時,系統不會傳送事件 (請參閱onArchive
),即使透過storage.objects.delete
方法進行封存也是如此。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,請安裝
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。時間
執行非同步工作時,請務必在
回呼。
範例:圖片轉換
搭配使用 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!");
這段程式碼會建立 儲存在暫存目錄中的圖片縮圖 200x200,然後上傳 返回「Cloud Storage」。
查看更多範例
其他常見的媒體轉換函式範例,包括 圖像轉碼 管理內容 擷取 EXIF 中繼資料。 完整清單如下: 。