คุณทริกเกอร์ฟังก์ชันเพื่อตอบสนองต่อการอัปโหลด อัปเดต หรือลบไฟล์และโฟลเดอร์ใน 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