ดาวน์โหลดไฟล์ด้วย Cloud Storage ใน Flutter

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

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

หากต้องการดาวน์โหลดไฟล์ ก่อนอื่นให้สร้างการอ้างอิง Cloud Storage ไปยังไฟล์ที่ต้องการดาวน์โหลด

คุณสร้างการอ้างอิงได้โดยการต่อท้ายเส้นทางย่อยกับรูทของที่เก็บข้อมูล Cloud Storage หรือจะสร้างการอ้างอิงจาก URL ของ gs:// หรือ https:// ที่มีอยู่ซึ่งอ้างอิงออบเจ็กต์ใน Cloud Storage ก็ได้

// Create a storage reference from our app
final storageRef = FirebaseStorage.instance.ref();

// Create a reference with an initial file path and name
final pathReference = storageRef.child("images/stars.jpg");

// Create a reference to a file from a Google Cloud Storage URI
final gsReference =
    FirebaseStorage.instance.refFromURL("gs://YOUR_BUCKET/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
final httpsReference = FirebaseStorage.instance.refFromURL(
    "https://firebasestorage.googleapis.com/b/YOUR_BUCKET/o/images%20stars.jpg");

ดาวน์โหลดไฟล์

เมื่อมีข้อมูลอ้างอิงแล้ว คุณจะดาวน์โหลดไฟล์จาก Cloud Storage ได้ โดยเรียกใช้ getData() หากต้องการดาวน์โหลดไฟล์ จากห้องสมุดอื่น คุณสามารถรับ URL สำหรับดาวน์โหลดได้ด้วย getDownloadUrl()

ดาวน์โหลดในหน่วยความจำ

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

final islandRef = storageRef.child("images/island.jpg");

try {
  const oneMegabyte = 1024 * 1024;
  final Uint8List? data = await islandRef.getData(oneMegabyte);
  // Data for "images/island.jpg" is returned, use this as needed.
} on FirebaseException catch (e) {
  // Handle any errors.
}

ดาวน์โหลดเป็นไฟล์ในเครื่อง

วิธี writeToFile() จะดาวน์โหลดไฟล์ไปยังอุปกรณ์ในเครื่องโดยตรง ใช้ฟีเจอร์นี้หาก ผู้ใช้ต้องการเข้าถึงไฟล์ขณะออฟไลน์หรือแชร์ไฟล์ในแอปอื่น writeToFile() จะแสดง DownloadTask ซึ่งคุณใช้เพื่อจัดการ การดาวน์โหลดและตรวจสอบสถานะการดาวน์โหลดได้

final islandRef = storageRef.child("images/island.jpg");

final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/images/island.jpg";
final file = File(filePath);

final downloadTask = islandRef.writeToFile(file);
downloadTask.snapshotEvents.listen((taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      // TODO: Handle this case.
      break;
    case TaskState.paused:
      // TODO: Handle this case.
      break;
    case TaskState.success:
      // TODO: Handle this case.
      break;
    case TaskState.canceled:
      // TODO: Handle this case.
      break;
    case TaskState.error:
      // TODO: Handle this case.
      break;
  }
});

ดาวน์โหลดข้อมูลผ่าน URL

หากมีโครงสร้างพื้นฐานในการดาวน์โหลดที่อิงตาม URL อยู่แล้ว หรือเพียงต้องการ URL เพื่อแชร์ คุณสามารถรับ URL สำหรับดาวน์โหลดไฟล์ได้โดยเรียกใช้เมธอด getDownloadURL() ในการอ้างอิง Cloud Storage

final imageUrl =
    await storageRef.child("users/me/profile.png").getDownloadURL();

จัดการข้อผิดพลาด

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

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

ตัวอย่างการดาวน์โหลดแบบเต็มพร้อมการจัดการข้อผิดพลาดแสดงอยู่ด้านล่าง

final islandRef = storageRef.child("images/island.jpg");

final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/images/island.jpg";
final file = File(filePath);

final downloadTask = islandRef.writeToFile(file);
downloadTask.snapshotEvents.listen((taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      // TODO: Handle this case.
      break;
    case TaskState.paused:
      // TODO: Handle this case.
      break;
    case TaskState.success:
      // TODO: Handle this case.
      break;
    case TaskState.canceled:
      // TODO: Handle this case.
      break;
    case TaskState.error:
      // TODO: Handle this case.
      break;
  }
});

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