ทริกเกอร์ Cloud Storage


คุณทริกเกอร์ฟังก์ชันเพื่อตอบสนองต่อการอัปโหลด อัปเดต หรือลบไฟล์และโฟลเดอร์ใน Cloud Storage ได้

ตัวอย่างในหน้านี้อิงตามฟังก์ชันตัวอย่างที่จะทริกเกอร์เมื่อมีการอัปโหลดไฟล์รูปภาพไปยัง Cloud Storage ฟังก์ชันตัวอย่างนี้แสดง วิธีเข้าถึงแอตทริบิวต์เหตุการณ์ วิธีดาวน์โหลดไฟล์ไปยังอินสแตนซ์ Cloud Functions และพื้นฐานอื่นๆ ในการจัดการเหตุการณ์ Cloud Storage

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