Mendownload file dengan Cloud Storage di Flutter

Dengan Cloud Storage for Firebase, Anda dapat mendownload file dengan cepat dan mudah dari bucket Cloud Storage yang disediakan dan dikelola oleh Firebase.

Membuat Referensi

Untuk mendownload file, buat referensi Cloud Storage terlebih dahulu ke file yang ingin didownload.

Anda dapat membuat referensi dengan menambahkan jalur turunan ke root bucket Cloud Storage, atau membuat referensi dari URL gs:// atau https:// yang sudah ada, yang mereferensikan suatu objek di 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");

Mendownload File

Setelah memiliki referensi, Anda dapat mendownload file dari Cloud Storage dengan memanggil getData() atau getStream(). Jika ingin mendownload file dengan library lain, Anda bisa mendapatkan URL download dengan getDownloadUrl().

Mendownload di memori

Download file ke UInt8List dengan metode getData(). Ini adalah cara termudah untuk mendownload file, tetapi cara ini harus memuat seluruh isi file Anda ke dalam memori. Jika Anda meminta file yang lebih besar daripada kapasitas memori aplikasi yang tersedia, aplikasi akan mengalami error. Untuk melindungi dari masalah memori, getData() menggunakan jumlah byte maksimum yang akan didownload. Setel ukuran maksimum ke kapasitas yang Anda yakin bisa ditangani oleh aplikasi atau gunakan metode download lain.

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.
}

Mendownload ke file lokal

Metode writeToFile() akan mendownload file secara langsung ke perangkat lokal. Gunakan metode ini jika pengguna Anda ingin memiliki akses ke file saat offline atau membagikan file di aplikasi lain. writeToFile() akan menampilkan DownloadTask yang dapat Anda gunakan untuk mengelola download dan memantau status download.

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;
  }
});

Mendownload Data melalui URL

Jika Anda sudah memiliki infrastruktur download berdasarkan URL, atau hanya ingin memiliki URL untuk dibagikan, Anda dapat memperoleh URL download untuk suatu file dengan memanggil metode getDownloadURL() pada referensi Cloud Storage.

final imageUrl =
    await storageRef.child("users/me/profile.png").getDownloadURL();

Menangani Error

Ada sejumlah alasan penyebab terjadinya error pada download, termasuk tidak adanya file atau pengguna tidak memiliki izin untuk mengakses file yang diinginkan. Informasi lebih lanjut mengenai error bisa dilihat di bagian Menangani Error pada dokumentasi.

Contoh Lengkap

Contoh lengkap download dengan penanganan error ditampilkan di bawah ini:

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;
  }
});

Anda juga dapat mengambil dan memperbarui metadata untuk file yang disimpan di Cloud Storage.