คุณทริกเกอร์ฟังก์ชันเพื่อตอบสนองต่อการอัปโหลด อัปเดต หรือลบไฟล์และโฟลเดอร์ใน 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.generateThumbnail = 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
คือ 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. const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.
ตัวอย่างการสร้างภาพขนาดย่อใช้คุณลักษณะบางอย่างเหล่านี้เพื่อตรวจหากรณีการออกซึ่งฟังก์ชันส่งคืน:
// 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 spawn = require('child-process-promise').spawn; const path = require('path'); const os = require('os'); const fs = require('fs');
ใช้ gcs.bucket.file(filePath).download
เพื่อดาวน์โหลดไฟล์ไปยังไดเร็กทอรีชั่วคราวบนอินสแตนซ์ Cloud Functions ของคุณ ในตำแหน่งนี้ คุณจะประมวลผลไฟล์ได้ตามต้องการแล้วอัปโหลดไปยัง Cloud Storage เมื่อทำงานแบบอะซิงโครนัส ตรวจสอบให้แน่ใจว่าคุณส่งคืนคำสัญญา JavaScript ในการเรียกกลับของคุณ
ตัวอย่าง: การแปลงภาพ
Cloud Functions มีโปรแกรมประมวลผลภาพที่เรียกว่า ImageMagick
ซึ่งสามารถจัดการไฟล์ภาพกราฟิกได้ ต่อไปนี้เป็นตัวอย่างวิธีสร้างภาพขนาดย่อสำหรับไฟล์ภาพที่อัปโหลด:
// Download file from bucket. const bucket = admin.storage().bucket(fileBucket); const tempFilePath = path.join(os.tmpdir(), fileName); const metadata = { contentType: contentType, }; await bucket.file(filePath).download({destination: tempFilePath}); functions.logger.log('Image downloaded locally to', tempFilePath); // Generate a thumbnail using ImageMagick. await spawn('convert', [tempFilePath, '-thumbnail', '200x200>', tempFilePath]); functions.logger.log('Thumbnail created at', tempFilePath); // We add a 'thumb_' prefix to thumbnails file name. That's where we'll upload the thumbnail. const thumbFileName = `thumb_${fileName}`; const thumbFilePath = path.join(path.dirname(filePath), thumbFileName); // Uploading the thumbnail. await bucket.upload(tempFilePath, { destination: thumbFilePath, metadata: metadata, }); // Once the thumbnail has been uploaded delete the local file to free up disk space. return fs.unlinkSync(tempFilePath);
โค้ดนี้เรียกใช้โปรแกรม convert
คำสั่ง ImageMagick
เพื่อสร้างภาพขนาดย่อขนาด 200x200 สำหรับภาพที่บันทึกไว้ในไดเร็กทอรีชั่วคราว จากนั้นอัปโหลดกลับไปยัง Cloud Storage
สำรวจตัวอย่างเพิ่มเติม
ตัวอย่างเพิ่มเติมของฟังก์ชันการแปลงสื่อทั่วไป รวมถึงการ แปลงรหัสรูปภาพ การ ดูแลเนื้อหา การ แยกข้อมูลเมตา EXIF รายการตัวอย่าง ทั้งหมดมีอยู่ใน GitHub
ดู เอกสาร ทริกเกอร์ Google Cloud Storage ฉบับสมบูรณ์สำหรับข้อมูลเพิ่มเติม