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

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

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

ดูตัวอย่างเพิ่มเติมเกี่ยวกับกรณีการใช้งานได้ที่ ฉันทำอะไรได้บ้างด้วย Cloud Functions?

ทริกเกอร์ฟังก์ชันเมื่อมีการเปลี่ยนแปลงใน Cloud Storage

ใช้ functions.storage เพื่อสร้างฟังก์ชันที่จัดการ Cloud Storage เหตุการณ์ ใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้ ทั้งนี้ขึ้นอยู่กับว่าคุณต้องการกำหนดขอบเขต ฟังก์ชันให้ทำงานกับ Bucket Cloud Storageที่เฉพาะเจาะจงหรือใช้ Bucket เริ่มต้น

  • functions.storage.object() เพื่อฟังการเปลี่ยนแปลงของออบเจ็กต์ใน Bucket เริ่มต้น Cloud Storage
  • functions.storage.bucket('bucketName').object() เพื่อฟังการเปลี่ยนแปลงของออบเจ็กต์ใน Bucket ที่เฉพาะเจาะจง

ตัวอย่างเช่น ตัวอย่างเครื่องมือสร้างภาพขนาดย่อมีการกำหนดขอบเขตให้ทำงานกับ Bucket เริ่มต้นของโปรเจ็กต์

exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => {
  // ...
});

Cloud Storage รองรับเหตุการณ์ต่อไปนี้

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

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

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

Cloud Functions แสดงแอตทริบิวต์ของออบเจ็กต์ Cloud Storage หลายรายการ เช่น `size` size และ `contentType` 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