Cloud Storage สำหรับ 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) {
// ...
}
อัปโหลดจากสตริง
คุณสามารถอัปโหลดข้อมูลเป็นสตริงที่เข้ารหัสแบบ raw, 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 กันดีกว่า