Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

雲存儲觸發器

您可以觸發一個函數來響應 Cloud Storage 中文件和文件夾的上傳、更新或刪除。

此頁面中的示例基於在將圖像文件上傳到 Cloud Storage 時觸發的示例函數。此示例函數演示瞭如何訪問事件屬性、如何將文件下載到 Cloud Functions 實例以及處理 Cloud Storage 事件的其他基礎知識。

有關使用案例更多的例子,看看我能做些什麼雲的功能呢?

在 Cloud Storage 更改時觸發函數

使用functions.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 對象屬性

雲功能暴露出了一些雲存儲對象的屬性,如sizecontentType的更新文件。該'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.
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 中存儲的文件生成縮略圖),您需要將文件下載到函數實例,即運行代碼的虛擬機。

輕鬆下載和重新上傳對象雲存儲,安裝谷歌雲存儲包使用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 Storage。執行異步任務時,請確保在回調中返回 JavaScript 承諾。

示例:圖像變換

雲功能提供稱為圖像處理程序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的縮略圖保存在一個臨時目錄中的圖片,然後上傳回雲存儲。

探索更多示例

的公共媒體變換函數包括多個示例代碼轉換的圖像緩和內容提取EXIF元數據。該實例完整列表,請在GitHub上。

查看完整的谷歌雲存儲觸發文檔以獲取更多信息。