Trình kích hoạt Cloud Storage (thế hệ đầu tiên)

Bạn có thể kích hoạt một hàm để phản hồi việc tải tệp và thư mục lên, cập nhật hoặc xoá tệp và thư mục trong Cloud Storage.

Các ví dụ trong trang này dựa trên một hàm mẫu kích hoạt khi tệp hình ảnh được tải lên Cloud Storage. Hàm mẫu này minh hoạ cách truy cập vào các thuộc tính của sự kiện, cách tải tệp xuống một thực thể Cloud Functions và các nguyên tắc cơ bản khác về việc xử lý các sự kiện Cloud Storage.

Để xem thêm ví dụ về các trường hợp sử dụng, hãy xem Tôi có thể làm gì với Cloud Functions?

Kích hoạt một hàm khi có Cloud Storage thay đổi

Sử dụng functions.storage để tạo một hàm xử lý Cloud Storage các sự kiện. Tuỳ thuộc vào việc bạn muốn giới hạn phạm vi hàm cho một nhóm Cloud Storage cụ thể hay sử dụng nhóm mặc định, hãy sử dụng một trong những cách sau:

Ví dụ: mẫu trình tạo hình thu nhỏ được giới hạn trong nhóm mặc định cho dự án:

exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => {
  // ...
});

Cloud Storage hỗ trợ các sự kiện sau:

  • onArchive Chỉ được gửi khi một nhóm đã bật tính năng kiểm soát phiên bản đối tượng. Sự kiện này cho biết rằng phiên bản trực tiếp của một đối tượng đã trở thành phiên bản được lưu trữ, do được lưu trữ hoặc do bị ghi đè bằng quá trình tải lên một đối tượng có cùng tên.
  • onDelete Được gửi khi một đối tượng đã bị xoá vĩnh viễn. Điều này bao gồm cả các đối tượng bị ghi đè hoặc bị xoá trong quá trình định cấu hình vòng đời của nhóm. Đối với các nhóm đã bật tính năng kiểm soát phiên bản đối tượng, sự kiện này sẽ không được gửi khi một đối tượng được lưu trữ (xem onArchive), ngay cả khi quá trình lưu trữ diễn ra thông qua phương thức storage.objects.delete.
  • onFinalize Được gửi khi một đối tượng mới (hoặc một thế hệ mới của đối tượng hiện có) được tạo thành công trong nhóm. Điều này bao gồm cả việc sao chép hoặc ghi lại một đối tượng hiện có. Quá trình tải lên không thành công sẽ không kích hoạt sự kiện này.
  • onMetadataUpdate Được gửi khi siêu dữ liệu của một đối tượng hiện có thay đổi.

Đặt sự kiện trong trình xử lý sự kiện on như minh hoạ ở trên cho onFinalize.

Truy cập vào các thuộc tính của đối tượng Cloud Storage

Cloud Functions hiển thị một số thuộc tính của đối tượng Cloud Storage, chẳng hạn như sizecontentType cho tệp đã cập nhật. Thuộc tính 'metageneration' sẽ tăng lên mỗi khi có thay đổi đối với siêu dữ liệu của đối tượng. Đối với các đối tượng mới, giá trị metageneration1.

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.

Mẫu tạo hình thu nhỏ sử dụng một số thuộc tính này để phát hiện các trường hợp thoát mà hàm trả về:

// 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.');
}

Tải tệp xuống, chuyển đổi và tải tệp lên

Trong một số trường hợp, bạn có thể không cần tải tệp xuống từ Cloud Storage. Tuy nhiên, để thực hiện các tác vụ chuyên sâu như tạo hình thu nhỏ từ một tệp được lưu trữ trong Cloud Storage, bạn cần tải tệp xuống thực thể hàm, tức là máy ảo chạy mã của bạn.

Để dễ dàng tải xuống và tải lại các đối tượng lên Cloud Storage, hãy cài đặt gói Google Cloud Storage bằng cách sử dụng npm install --save @google-cloud/storage, và nhập gói đó. Để sử dụng các lời hứa JavaScript nhằm xử lý các quy trình bên ngoài như các tác vụ xử lý hình thu nhỏ trong mẫu, hãy nhập cả 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');

Sử dụng gcs.bucket.file(filePath).download để tải tệp xuống một thư mục tạm thời trên thực thể Cloud Functions của bạn. Ở vị trí này, bạn có thể xử lý tệp theo nhu cầu rồi tải lên Cloud Storage. Khi thực hiện các tác vụ không đồng bộ, hãy nhớ trả về một lời hứa JavaScript trong lệnh gọi lại.

Ví dụ: chuyển đổi hình ảnh

Khi sử dụng Cloud Functions cùng với các chương trình xử lý hình ảnh như sharp, bạn có thể thực hiện các thao tác trên tệp hình ảnh đồ hoạ. Sau đây là ví dụ về cách tạo hình thu nhỏ cho một tệp hình ảnh đã tải lên:

// 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!");

Mã này tạo hình thu nhỏ 200x200 cho hình ảnh được lưu trong một thư mục tạm thời, sau đó tải hình thu nhỏ đó trở lại Cloud Storage.

Khám phá thêm ví dụ

Xem thêm ví dụ về các hàm chuyển đổi nội dung đa phương tiện phổ biến, bao gồm cả việc chuyển mã hình ảnh, kiểm duyệt nội dung, trích xuất siêu dữ liệu EXIF. Bạn có thể xem danh sách đầy đủ các ví dụ trên GitHub.