Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

ทริกเกอร์ที่เก็บข้อมูลบนคลาวด์

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

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