ทริกเกอร์ 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 ส่งเมื่อที่เก็บข้อมูลได้เปิดใช้การกำหนดเวอร์ชันออบเจ็กต์เท่านั้น เหตุการณ์นี้แสดงให้เห็นว่าเวอร์ชันที่ทำงานอยู่ของออบเจ็กต์ได้กลายเป็นเวอร์ชันที่เก็บถาวร เนื่องจากมีการเก็บถาวรหรือเขียนทับโดยการอัปโหลดออบเจ็กต์ที่มีชื่อเดียวกัน
  • 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 เมื่อทำงานแบบไม่พร้อมกัน ให้ตรวจสอบว่าคุณได้แสดงผลพรอมิส 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