Catch up on highlights from Firebase at Google I/O 2023. Learn more

Mở rộng bộ nhớ đám mây với các chức năng đám mây


Bạn có thể kích hoạt một chức năng để đáp ứng việc tải lên, cập nhật hoặc xóa các tệp và thư mục trong Cloud Storage.

Các ví dụ trong trang này dựa trên chức năng 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 trình bày cách truy cập các thuộc tính sự kiện, cách tải tệp xuống phiên bản Hàm đám mây và các nguyên tắc cơ bản khác để xử lý các sự kiện Lưu trữ đám mây.

Để biết 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 Function?

Kích hoạt một chức năng trên các thay đổi của Cloud Storage

Sử dụng functions.storage để tạo hàm xử lý các sự kiện Lưu trữ đám mây. Tùy thuộc vào việc bạn muốn phạm vi chức năng của mình cho một bộ chứa Cloud Storage cụ thể hay sử dụng bộ chứa mặc định, hãy sử dụng một trong các cách sau:

Ví dụ: mẫu trình tạo hình thu nhỏ nằm trong phạm vi 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 đã kích hoạt lập phiên bản đối tượng . Sự kiện này cho biết rằng phiên bản đang hoạt động của một đối tượng đã trở thành phiên bản được lưu trữ, bởi vì nó đã được lưu trữ hoặc bởi vì nó đã bị ghi đè khi 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ị xóa vĩnh viễn. Điều này bao gồm các đối tượng bị ghi đè hoặc bị xóa như một phần của cấu hình vòng đời của bộ chứa. Đối với các bộ chứa có bật phiên bản đối tượng , điều 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 thế hệ mới của một đối tượng hiện có) được tạo thành công trong bộ chứa. Điều này bao gồm sao chép hoặc viết lại một đối tượng hiện có. Tải lên không thành công 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ư được hiển thị ở trên cho onFinalize .

Truy cập thuộc tính đối tượng Cloud Storage

Cloud Functions hiển thị một số thuộc tính đối tượng Cloud Storage, chẳng hạn như sizecontentType cho tệp được cập nhật. Thuộc tính 'siêu dữ liệu' được tăng lên bất cứ khi nào 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 xuống, chuyển đổi và tải lên tệp

Đối với một số trường hợp, 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 ảnh thu nhỏ từ tệp được lưu trữ trong Cloud Storage, bạn cần tải tệp xuống phiên bản chức năng—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 lời hứa JavaScript để xử lý các quy trình bên ngoài như các tác vụ xử lý hình thu nhỏ trong ví dụ, hãy nhập child-process-promise :

const functions = require('firebase-functions');
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 phiên bản Cloud Function của bạn. Ở vị trí này, bạn có thể xử lý tệp khi cần và sau đó tải lên Cloud Storage. Khi thực hiện các tác vụ không đồng bộ, hãy đảm bảo bạn trả lại lời hứa JavaScript trong lệnh gọi lại của mình.

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

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 các tệp hình ảnh đồ họa. Sau đây là ví dụ về cách tạo hình ảnh thu nhỏ cho 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 nó trở lại Cloud Storage.

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

Thêm ví dụ về các chức năng chuyển đổi phương tiện phổ biến bao gồm chuyển mã hình ảnh , kiểm duyệt nội dung , trích xuất siêu dữ liệu EXIF . Danh sách đầy đủ các ví dụ có sẵn trên GitHub.