Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

คุณทริกเกอร์ฟังก์ชันเพื่อตอบสนองต่อการอัปโหลด อัปเดต หรือลบไฟล์และโฟลเดอร์ใน Cloud Storage ได้

ตัวอย่างในหน้านี้อิงตามฟังก์ชันตัวอย่างที่ทริกเกอร์เมื่อมีการอัปโหลดไฟล์รูปภาพไปยัง Cloud Storage ฟังก์ชันตัวอย่างนี้สาธิตวิธีเข้าถึงแอตทริบิวต์ของเหตุการณ์ วิธีดาวน์โหลดไฟล์ไปยังอินสแตนซ์ Cloud Functions และพื้นฐานอื่นๆ ในการจัดการเหตุการณ์ Cloud Storage

สำหรับตัวอย่างเพิ่มเติมกรณีการใช้งานให้ดู สิ่งที่ฉันสามารถทำอะไรกับฟังก์ชั่นคลาวด์?

ทริกเกอร์ฟังก์ชันในการเปลี่ยนแปลง Cloud Storage

ใช้ functions.storage การสร้างฟังก์ชั่นที่จับเหตุการณ์ Cloud Storage ขึ้นอยู่กับว่าคุณต้องการกำหนดขอบเขตฟังก์ชันของคุณไปยังที่เก็บข้อมูล Cloud Storage เฉพาะหรือใช้ที่เก็บข้อมูลเริ่มต้น ให้ใช้สิ่งใดสิ่งหนึ่งต่อไปนี้:

  • functions.storage.object() ฟังสำหรับการเปลี่ยนแปลงวัตถุบนเริ่มต้นการจัดเก็บเมฆถัง
  • functions.storage.bucket('bucketName').object() ฟังสำหรับการเปลี่ยนแปลงวัตถุบนถังที่เฉพาะเจาะจง

ตัวอย่างเช่น ตัวอย่างตัวสร้างภาพขนาดย่อถูกกำหนดขอบเขตเป็นบัคเก็ตเริ่มต้นสำหรับโปรเจ็กต์:

exports.generateThumbnail = functions.storage.object().onFinalize(async (object) => {
  // ...
});

Cloud Storage รองรับเหตุการณ์เหล่านี้:

  • onArchive เท่านั้นส่งเมื่อถังได้เปิดใช้งาน เวอร์ชันวัตถุ เหตุการณ์นี้บ่งชี้ว่าเวอร์ชันที่ใช้งานจริงของอ็อบเจ็กต์ได้กลายเป็นเวอร์ชันที่เก็บถาวรแล้ว อาจเป็นเพราะว่าถูกเก็บถาวรหรือเพราะถูกเขียนทับโดยการอัปโหลดของอ็อบเจ็กต์ที่มีชื่อเดียวกัน
  • onDelete ส่งเมื่อวัตถุถูกลบอย่างถาวร ซึ่งรวมถึงวัตถุที่จะถูกเขียนทับหรือถูกลบเป็นส่วนหนึ่งของถังที่ กำหนดค่าวงจร สำหรับบุ้งกี๋กับ วัตถุกำหนดรุ่น ที่เปิดใช้งานนี้ไม่ได้ส่งเมื่อวัตถุถูกเก็บถาวร (ดู onArchive ) แม้ว่าจดหมายเหตุเกิดขึ้นผ่านทาง storage.objects.delete วิธี
  • onFinalize ส่งเมื่อวัตถุใหม่ (หรือรุ่นใหม่ของวัตถุที่มีอยู่) จะถูกสร้างขึ้นประสบความสำเร็จในถัง ซึ่งรวมถึงการคัดลอกหรือเขียนใหม่วัตถุที่มีอยู่ การอัปโหลดที่ล้มเหลวจะไม่ทริกเกอร์เหตุการณ์นี้
  • onMetadataUpdate ส่งเมื่อเมตาดาต้าของการเปลี่ยนแปลงวัตถุที่มีอยู่

ตั้งเหตุการณ์ภายใน on จัดการเหตุการณ์ที่แสดงข้างต้นสำหรับ onFinalize

เข้าถึงแอตทริบิวต์ออบเจ็กต์ Cloud Storage

ฟังก์ชั่นคลาวด์ exposes จำนวนของวัตถุ 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.
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 คุณต้องดาวน์โหลดไฟล์ไปยังอินสแตนซ์ของฟังก์ชัน นั่นคือเครื่องเสมือนที่เรียกใช้โค้ดของคุณ

เพื่อให้ง่ายต่อการดาวน์โหลดและอัปโหลดใหม่วัตถุที่จะจัดเก็บเมฆติดตั้ง แพคเกจข้อมูล 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 Storage เมื่อทำงานแบบอะซิงโครนัส ตรวจสอบให้แน่ใจว่าคุณส่งคืนคำสัญญา JavaScript ในการเรียกกลับของคุณ

ตัวอย่าง: การแปลงภาพ

ฟังก์ชั่นคลาวด์ยังมีโปรแกรมการประมวลผลภาพที่เรียกว่า 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);

รหัสนี้ดำเนินการ ImageMagick โปรแกรมบรรทัดคำสั่ง convert เพื่อสร้าง 200x200 รูปย่อสำหรับภาพที่บันทึกไว้ในไดเรกทอรีชั่วคราวแล้วอัพโหลดมันกลับไปที่การจัดเก็บเมฆ

สำรวจตัวอย่างเพิ่มเติม

ตัวอย่างเพิ่มเติมฟังก์ชั่นการเปลี่ยนแปลงสื่อร่วมกันรวมทั้ง การแปลงรหัสภาพ , ดูแลเนื้อหา , การสกัดเมตาดาต้า EXIF รายการเต็มรูปแบบของตัวอย่าง สามารถใช้ได้บน GitHub

ดูเรียกข้อมูล Google Cloud Storage เต็ม เอกสาร สำหรับข้อมูลเพิ่มเติม