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