ทริกเกอร์ Cloud Storage


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

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

การใช้ฟังก์ชันระบบคลาวด์ร่วมกับโปรแกรมประมวลผลรูปภาพ เช่น 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