Tải tệp lên bằng Cloud Storage trên Flutter

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 một đường dẫn tệp và truyền đường dẫn đó đến 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()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 pauseprogress 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ể được 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.