雲存儲觸發器

您可以觸發一個函數來響應 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上。

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