สร้างการอ้างอิง Cloud Storage ใน Flutter

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

หากคุณเคยใช้ฐานข้อมูลเรียลไทม์ของ Firebase มาก่อน คุณจะคุ้นเคยกับเส้นทางเหล่านี้เป็นอย่างดี อย่างไรก็ตาม ระบบจะจัดเก็บข้อมูลไฟล์ไว้ใน Cloud Storage ไม่ใช่ ในฐานข้อมูลเรียลไทม์

สร้างการอ้างอิง

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

สร้างการอ้างอิงโดยใช้อินสแตนซ์ Singleton ของ FirebaseStorage และเรียกใช้เมธอด ref()

final storageRef = FirebaseStorage.instance.ref();

จากนั้นคุณสามารถสร้างการอ้างอิงไปยังตำแหน่งที่ต่ำกว่าในโครงสร้างแบบต้นไม้, เช่น "images/space.jpg" โดยใช้เมธอด child() ในการอ้างอิงที่มีอยู่

// Create a child reference
// imagesRef now points to "images"
final imagesRef = storageRef.child("images");

// Child references can also take paths
// spaceRef now points to "images/space.jpg
// imagesRef still points to "images"
final spaceRef = storageRef.child("images/space.jpg");

นอกจากนี้ คุณยังใช้พร็อพเพอร์ตี้ parent และ root เพื่อไปยังส่วนต่างๆ ในลำดับชั้นของไฟล์ได้ด้วย parent จะไปยังส่วนต่างๆ ขึ้นไป 1 ระดับ ส่วน root จะไปยังส่วนต่างๆ ขึ้นไปจนถึงระดับบนสุด

// parent allows us to move our reference to a parent node
// imagesRef2 now points to 'images'
final imagesRef2 = spaceRef.parent;

// root allows us to move all the way back to the top of our bucket
// rootRef now points to the root
final rootRef = spaceRef.root;

child(), parent และ root สามารถเชื่อมโยงเข้าด้วยกันได้หลายครั้ง เนื่องจากแต่ละรายการเป็นการอ้างอิง แต่การเข้าถึง root.parent จะส่งผลให้ได้ค่า null

// References can be chained together multiple times
// earthRef points to 'images/earth.jpg'
final earthRef = spaceRef.parent?.child("earth.jpg");

// nullRef is null, since the parent of root is null
final nullRef = spaceRef.root.parent;

พร็อพเพอร์ตี้การอ้างอิง

คุณสามารถตรวจสอบการอ้างอิงเพื่อทำความเข้าใจไฟล์ที่การอ้างอิงชี้ได้ดียิ่งขึ้นโดยใช้พร็อพเพอร์ตี้ fullPath, name และ bucket พร็อพเพอร์ตี้เหล่านี้จะรับเส้นทางแบบเต็ม ชื่อ และ Bucket ของไฟล์

// Reference's path is: "images/space.jpg"
// This is analogous to a file path on disk
spaceRef.fullPath;

// Reference's name is the last segment of the full path: "space.jpg"
// This is analogous to the file name
spaceRef.name;

// Reference's bucket is the name of the storage bucket that the files are stored in
spaceRef.bucket;

ข้อจำกัดในการอ้างอิง

เส้นทางการอ้างอิงและชื่อสามารถมีการเรียงลำดับของอักขระ Unicode ที่ถูกต้อง แต่จะมีข้อจำกัดบางอย่าง ได้แก่

  1. ความยาวทั้งหมดของ reference.fullPath ต้องอยู่ระหว่าง 1 ถึง 1024 ไบต์เมื่อเข้ารหัส UTF-8
  2. ไม่มีอักขระขึ้นบรรทัดใหม่หรือป้อนบรรทัด
  3. หลีกเลี่ยงการใช้ #, [, ], *, หรือ ? เนื่องจากอักขระเหล่านี้ทำงานได้ไม่ดีกับ เครื่องมืออื่นๆ เช่น ฐานข้อมูลเรียลไทม์ของ Firebase หรือ gsutil

ตัวอย่างแบบเต็ม

// Points to the root reference
final storageRef = FirebaseStorage.instance.ref();

// Points to "images"
Reference? imagesRef = storageRef.child("images");

// Points to "images/space.jpg"
// Note that you can use variables to create child values
final fileName = "space.jpg";
final spaceRef = imagesRef.child(fileName);

// File path is "images/space.jpg"
final path = spaceRef.fullPath;

// File name is "space.jpg"
final name = spaceRef.name;

// Points to "images"
imagesRef = spaceRef.parent;

จากนั้นมาดูวิธีอัปโหลดไฟล์ไปยัง Cloud Storage กัน