ดาวน์โหลดไฟล์ด้วย 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() หรือ getStream() หากต้องการดาวน์โหลดไฟล์ ด้วยไลบรารีอื่น คุณจะได้รับ 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