Cloud Storage for Firebase ช่วยให้คุณอัปโหลดไฟล์ไปยังที่เก็บข้อมูล Cloud Storage ที่ Firebase จัดหาให้และจัดการได้อย่างรวดเร็วและง่ายดาย
อัปโหลดไฟล์
หากต้องการอัปโหลดไฟล์ไปยัง Cloud Storage คุณต้องสร้างการอ้างอิงไปยัง เส้นทางแบบเต็มของไฟล์ รวมถึงชื่อไฟล์ก่อน
// Create a storage reference from our app
final storageRef = FirebaseStorage.instance.ref();
// Create a reference to "mountains.jpg"
final mountainsRef = storageRef.child("mountains.jpg");
// Create a reference to 'images/mountains.jpg'
final mountainImagesRef = storageRef.child("images/mountains.jpg");
// While the file names are the same, the references point to different files
assert(mountainsRef.name == mountainImagesRef.name);
assert(mountainsRef.fullPath != mountainImagesRef.fullPath);
เมื่อสร้างข้อมูลอ้างอิงที่เหมาะสมแล้ว ให้เรียกใช้เมธอด
putFile(), putString() หรือ putData() เพื่ออัปโหลดไฟล์
ไปยัง Cloud Storage
คุณจะอัปโหลดข้อมูลที่มีการอ้างอิงถึงรูทของที่เก็บข้อมูล Cloud Storage ไม่ได้ การอ้างอิงต้องชี้ไปยัง URL ของเด็ก
อัปโหลดจากไฟล์
หากต้องการอัปโหลดไฟล์ คุณต้องรับเส้นทางสัมบูรณ์ไปยังตำแหน่งในอุปกรณ์ของไฟล์นั้นก่อน
 เช่น หากมีไฟล์อยู่ในไดเรกทอรีเอกสารของแอปพลิเคชัน
ให้ใช้แพ็กเกจ path_provider
อย่างเป็นทางการเพื่อสร้างเส้นทางไฟล์และส่งไปยัง putFile()
Directory appDocDir = await getApplicationDocumentsDirectory();
String filePath = '${appDocDir.absolute}/file-to-upload.png';
File file = File(filePath);
try {
  await mountainsRef.putFile(file);
} on firebase_core.FirebaseException catch (e) {
  // ...
}
อัปโหลดจากสตริง
คุณอัปโหลดข้อมูลเป็นสตริงที่เข้ารหัสแบบดิบ base64, base64url หรือ data_url ได้
โดยใช้วิธี putString() เช่น หากต้องการอัปโหลดสตริงข้อความที่เข้ารหัสเป็น URL ข้อมูล ให้ทำดังนี้
String dataUrl = 'data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==';
try {
  await mountainsRef.putString(dataUrl, format: PutStringFormat.dataUrl);
} on FirebaseException catch (e) {
  // ...
}
การอัปโหลดข้อมูลดิบ
คุณสามารถอัปโหลดข้อมูลที่พิมพ์ระดับล่างในรูปแบบของ Uint8List
ในกรณีที่การอัปโหลดสตริงหรือ File ไม่สะดวก ในกรณีนี้ ให้เรียกใช้เมธอด putData() ด้วยข้อมูลของคุณ
try {
  // Upload raw data.
  await mountainsRef.putData(data);
} on firebase_core.FirebaseException catch (e) {
  // ...
}
รับ URL สำหรับดาวน์โหลด
หลังจากอัปโหลดไฟล์แล้ว คุณจะรับ URL เพื่อดาวน์โหลดไฟล์ได้โดยเรียกใช้เมธอด getDownloadUrl() ใน Reference ดังนี้
await mountainsRef.getDownloadURL();
เพิ่มข้อมูลเมตาของไฟล์
นอกจากนี้ คุณยังใส่ข้อมูลเมตาเมื่ออัปโหลดไฟล์ได้ด้วย
ข้อมูลเมตานี้มีพร็อพเพอร์ตี้ข้อมูลเมตาของไฟล์ทั่วไป เช่น contentType
(โดยทั่วไปเรียกว่าประเภท MIME) putFile()เมธอด
จะอนุมานประเภท MIME จากส่วนขยาย File โดยอัตโนมัติ แต่คุณสามารถ
ลบล้างประเภทที่ตรวจหาอัตโนมัติได้โดยการระบุ contentType ในข้อมูลเมตา หากคุณไม่ระบุ contentType และ Cloud Storage ไม่สามารถอนุมานค่าเริ่มต้นจากนามสกุลไฟล์ได้ Cloud Storage จะใช้ application/octet-stream ดูใช้ข้อมูลเมตาของไฟล์
try {
  await mountainsRef.putFile(file, SettableMetadata(
    contentType: "image/jpeg",
  ));
} on firebase_core.FirebaseException catch (e) {
  // ...
}
จัดการการอัปโหลด
นอกเหนือจากการเริ่มอัปโหลดแล้ว คุณยังหยุดชั่วคราว กลับมาอัปโหลดต่อ และยกเลิกการอัปโหลดได้โดยใช้วิธีการ pause(), resume() และ cancel() เหตุการณ์หยุดชั่วคราวและเล่นต่อ
จะทำให้เกิดการเปลี่ยนแปลงสถานะ pause และ progress ตามลำดับ การยกเลิกการอัปโหลดจะทำให้การอัปโหลดไม่สำเร็จและมีข้อผิดพลาดที่ระบุว่ามีการยกเลิกการอัปโหลด
final task = mountainsRef.putFile(largeFile);
// Pause the upload.
bool paused = await task.pause();
print('paused, $paused');
// Resume the upload.
bool resumed = await task.resume();
print('resumed, $resumed');
// Cancel the upload.
bool canceled = await task.cancel();
print('canceled, $canceled');
ตรวจสอบความคืบหน้าในการอัปโหลด
คุณสามารถฟังสตรีมเหตุการณ์ของงานเพื่อจัดการความสำเร็จ ความล้มเหลว ความคืบหน้า หรือการหยุดชั่วคราวในงานอัปโหลดได้โดยทำดังนี้
| ประเภทเหตุการณ์ | การใช้งานทั่วไป | 
|---|---|
| TaskState.running | ส่งเป็นระยะๆ ขณะโอนข้อมูล และใช้เพื่อแสดงตัวบ่งชี้การอัปโหลด/ดาวน์โหลดได้ | 
| TaskState.paused | ปล่อยออกมาทุกครั้งที่หยุดงานชั่วคราว | 
| TaskState.success | ปล่อยออกมาเมื่องานเสร็จสมบูรณ์แล้ว | 
| TaskState.canceled | ปล่อยเมื่อใดก็ตามที่ยกเลิกงาน | 
| TaskState.error | ปล่อยออกมาเมื่อการอัปโหลดล้มเหลว ซึ่งอาจเกิดจากเครือข่ายหมดเวลา การให้สิทธิ์ล้มเหลว หรือหากคุณยกเลิกงาน | 
mountainsRef.putFile(file).snapshotEvents.listen((taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      // ...
      break;
    case TaskState.paused:
      // ...
      break;
    case TaskState.success:
      // ...
      break;
    case TaskState.canceled:
      // ...
      break;
    case TaskState.error:
      // ...
      break;
  }
});
การจัดการข้อผิดพลาด
การอัปโหลดอาจเกิดข้อผิดพลาดได้ด้วยเหตุผลหลายประการ เช่น ไม่มีไฟล์ในเครื่อง หรือผู้ใช้ไม่มีสิทธิ์อัปโหลด ไฟล์ที่ต้องการ ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดได้ในส่วนจัดการข้อผิดพลาดของเอกสาร
ตัวอย่างแบบเต็ม
ตัวอย่างการอัปโหลดแบบเต็มพร้อมการตรวจสอบความคืบหน้าและการจัดการข้อผิดพลาด แสดงอยู่ด้านล่าง
final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/path/to/mountains.jpg";
final file = File(filePath);
// Create the file metadata
final metadata = SettableMetadata(contentType: "image/jpeg");
// Create a reference to the Firebase Storage bucket
final storageRef = FirebaseStorage.instance.ref();
// Upload file and metadata to the path 'images/mountains.jpg'
final uploadTask = storageRef
    .child("images/path/to/mountains.jpg")
    .putFile(file, metadata);
// Listen for state changes, errors, and completion of the upload.
uploadTask.snapshotEvents.listen((TaskSnapshot taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      final progress =
          100.0 * (taskSnapshot.bytesTransferred / taskSnapshot.totalBytes);
      print("Upload is $progress% complete.");
      break;
    case TaskState.paused:
      print("Upload is paused.");
      break;
    case TaskState.canceled:
      print("Upload was canceled");
      break;
    case TaskState.error:
      // Handle unsuccessful uploads
      break;
    case TaskState.success:
      // Handle successful uploads on complete
      // ...
      break;
  }
});
เมื่ออัปโหลดไฟล์แล้ว มาดูวิธีดาวน์โหลดไฟล์จาก Cloud Storage กัน