ทริกเกอร์ Cloud Storage (รุ่นที่ 1)

คุณสามารถทริกเกอร์ฟังก์ชันเพื่อตอบสนองต่อการอัปโหลด อัปเดต หรือ ลบไฟล์และโฟลเดอร์ใน 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 ส่งเมื่อ Bucket ได้เปิดใช้การกำหนดเวอร์ชันออบเจ็กต์เท่านั้น เหตุการณ์นี้แสดงให้เห็นว่าเวอร์ชันที่ทำงานอยู่ของออบเจ็กต์ได้กลายเป็นเวอร์ชันที่เก็บถาวร เนื่องจากมีการเก็บถาวรหรือเขียนทับโดยการอัปโหลดออบเจ็กต์ที่มีชื่อเดียวกัน
  • onDelete ส่งเมื่อออบเจ็กต์ถูกลบอย่างถาวร ซึ่งรวมถึงออบเจ็กต์ที่ถูกเขียนทับหรือลบจากส่วนหนึ่งของการกำหนดค่าอายุการใช้งานของ Bucket สำหรับที่เก็บข้อมูลที่เปิดใช้การกำหนดเวอร์ชันออบเจ็กต์ ระบบจะไม่ส่งเหตุการณ์นี้เมื่อมีการเก็บออบเจ็กต์ถาวร (ดู onArchive) แม้ว่าการเก็บถาวรจะเกิดขึ้นผ่านเมธอด storage.objects.delete ก็ตาม
  • onFinalize ส่งเมื่อมีการสร้างออบเจ็กต์ใหม่ (หรือรุ่นใหม่ของออบเจ็กต์ที่มีอยู่) ใน Bucket เรียบร้อยแล้ว ซึ่งรวมถึงการคัดลอกหรือเขียนออบเจ็กต์ที่มีอยู่ใหม่ การอัปโหลดที่ล้มเหลวจะไม่ทริกเกอร์เหตุการณ์นี้
  • 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 เมื่อทำงานแบบไม่พร้อมกัน ให้ตรวจสอบว่าคุณแสดงผล Promise ของ JavaScript ในฟังก์ชันเรียกกลับ

ตัวอย่าง: การแปลงรูปภาพ

คุณสามารถใช้ 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 รายการตัวอย่างทั้งหมดมีอยู่ใน GitHub