ทริกเกอร์ที่เก็บข้อมูลบนคลาวด์


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

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

สำหรับตัวอย่างกรณีการใช้งานเพิ่มเติม โปรดดูที่ ฉันสามารถทำอะไรกับฟังก์ชันคลาวด์ได้บ้าง

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

ตั้งค่าเหตุการณ์ภายในตัวจัดการ on ตามที่แสดงด้านบนสำหรับ onFinalize

เข้าถึงแอตทริบิวต์ออบเจ็กต์ Cloud Storage

Cloud Functions เปิดเผยแอตทริบิวต์ออบเจ็กต์ Cloud Storage จำนวนหนึ่ง เช่น size และ contentType สำหรับไฟล์ที่อัปเดต แอตทริบิวต์ "การสร้างเมตา" จะเพิ่มขึ้นทุกครั้งที่มีการเปลี่ยนแปลงข้อมูลเมตาของออบเจ็กต์ สำหรับออบเจ็กต์ใหม่ ค่า 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