คุณสามารถทริกเกอร์ฟังก์ชันเพื่อตอบสนองต่อการอัปโหลด อัปเดต หรือลบไฟล์และโฟลเดอร์ใน Cloud Storage
ตัวอย่างในหน้านี้อ้างอิงจากฟังก์ชันตัวอย่างที่ทริกเกอร์เมื่ออัปโหลดไฟล์รูปภาพไปยัง Cloud Storage ฟังก์ชันตัวอย่างนี้สาธิตวิธีเข้าถึงแอตทริบิวต์ของเหตุการณ์ วิธีดาวน์โหลดไฟล์ไปยังอินสแตนซ์ของ Cloud Function และพื้นฐานอื่นๆ ในการจัดการเหตุการณ์ของ Cloud Storage
สำหรับตัวอย่างกรณีการใช้งานเพิ่มเติม โปรดดูที่ ฉันสามารถทำอะไรกับ Cloud Functions ได้บ้าง
ทริกเกอร์ฟังก์ชั่นในการเปลี่ยนแปลงที่เก็บข้อมูลบนคลาวด์
ใช้ 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' จะเพิ่มขึ้นทุกครั้งที่มีการเปลี่ยนแปลงข้อมูลเมตาของวัตถุ สำหรับออบเจกต์ใหม่ ค่า 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'); 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