Cloud Storage cho Firebase giúp bạn nhanh chóng và dễ dàng tải tệp lên Đã cung cấp bộ chứa Cloud Storage và được Firebase quản lý.
Tải tệp lên
Để tải tệp lên Cloud Storage, trước tiên bạn phải tạo tham chiếu đến đường dẫn đầy đủ của tệp, bao gồm cả tên tệp.
// 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);
Sau khi tạo tệp đối chiếu thích hợp, bạn hãy gọi hàm
Phương thức putFile()
, putString()
hoặc putData()
để tải tệp lên
lên Cloud Storage.
Bạn không thể tải lên dữ liệu có tham chiếu đến thư mục gốc của Bộ chứa Cloud Storage. Tham chiếu của bạn phải trỏ đến một URL con.
Tải lên từ một tệp
Để tải một tệp lên, trước tiên, bạn phải lấy đường dẫn tuyệt đối đến tệp đó trên thiết bị
vị trí. Ví dụ: nếu tệp tồn tại trong các tài liệu của đơn đăng ký
hãy sử dụng thư mục path_provider
chính thức
gói để tạo đường dẫn tệp và truyền đường dẫn đó vào 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) {
// ...
}
Tải lên từ một chuỗi
Bạn có thể tải dữ liệu lên dưới dạng tệp thô, base64
, base64url
hoặc data_url
được mã hoá
bằng cách sử dụng phương thức putString()
. Ví dụ: để tải lên một chuỗi văn bản
được mã hoá dưới dạng URL Dữ liệu:
String dataUrl = 'data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==';
try {
await mountainsRef.putString(dataUrl, format: PutStringFormat.dataUrl);
} on FirebaseException catch (e) {
// ...
}
Tải dữ liệu thô lên
Bạn có thể tải dữ liệu đã nhập ở cấp thấp hơn lên dưới dạng Uint8List
đối với những trường hợp không thể tải lên một chuỗi hoặc File
. Trong phần này
trong trường hợp, hãy gọi phương thức putData()
với dữ liệu của bạn:
try {
// Upload raw data.
await mountainsRef.putData(data);
} on firebase_core.FirebaseException catch (e) {
// ...
}
Nhận URL tải xuống
Sau khi tải tệp lên, bạn có thể nhận URL để tải tệp xuống bằng cách gọi
phương thức getDownloadUrl()
trên Reference
:
await mountainsRef.getDownloadURL();
Thêm siêu dữ liệu tệp
Bạn cũng có thể thêm siêu dữ liệu khi tải tệp lên.
Siêu dữ liệu này chứa các thuộc tính siêu dữ liệu của tệp điển hình như contentType
(thường được gọi là loại MIME). Phương thức putFile()
tự động suy luận loại MIME từ tiện ích File
, nhưng bạn có thể
ghi đè loại được phát hiện tự động bằng cách chỉ định contentType
trong siêu dữ liệu. Nếu
bạn không cung cấp contentType
và Cloud Storage không thể dự đoán
mặc định từ đuôi tệp, Cloud Storage sử dụng
application/octet-stream
. Xem phần Sử dụng siêu dữ liệu tệp.
try {
await mountainsRef.putFile(file, SettableMetadata(
contentType: "image/jpeg",
));
} on firebase_core.FirebaseException catch (e) {
// ...
}
Quản lý tải lên
Ngoài việc bắt đầu tải lên, bạn có thể tạm dừng, tiếp tục và huỷ quá trình tải lên bằng cách sử dụng
phương thức pause()
, resume()
và cancel()
. Tạm dừng và tiếp tục sự kiện
hãy tăng các thay đổi trạng thái pause
và progress
tương ứng. Huỷ
làm cho quá trình tải lên không thành công kèm theo một lỗi cho biết rằng
quá trình tải lên đã bị huỷ.
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');
Theo dõi tiến trình tải lên
Bạn có thể nghe luồng sự kiện của một việc cần làm để xử lý trạng thái thành công, không thành công, tiến trình hoặc tạm dừng trong tác vụ tải lên:
Loại sự kiện | Cách sử dụng thông thường |
---|---|
TaskState.running |
Được phát định kỳ khi dữ liệu được truyền và có thể dùng để điền chỉ báo tải lên/tải xuống. |
TaskState.paused |
Được phát bất cứ khi nào việc cần làm bị tạm dừng. |
TaskState.success |
Được phát khi tác vụ đã hoàn tất thành công. |
TaskState.canceled |
Được kích hoạt bất cứ khi nào việc cần làm bị huỷ. |
TaskState.error |
Được phát khi quá trình tải lên không thành công. Điều này có thể xảy ra do hết thời gian chờ mạng, lỗi uỷ quyền hoặc nếu bạn huỷ tác vụ. |
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;
}
});
Lỗi xử lý
Có một số lý do khiến lỗi có thể xảy ra khi tải lên, bao gồm tệp cục bộ không tồn tại hoặc người dùng không có quyền tải lên tệp mong muốn. Bạn có thể tìm thêm thông tin về các lỗi trong phần Phần Xử lý lỗi trong tài liệu.
Ví dụ đầy đủ
Ví dụ đầy đủ về một tệp tải lên có tính năng theo dõi tiến trình và xử lý lỗi được hiển thị dưới đây:
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;
}
});
Giờ bạn đã tải tệp lên, hãy tìm hiểu cách tải tệp xuống từ Cloud Storage.