Mendownload File dengan Cloud Storage untuk C++

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

Membuat Referensi

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

Anda dapat membuat referensi dengan menambahkan jalur turunan ke root penyimpanan, atau membuat referensi dari URL gs:// atau https:// yang sudah ada, yang mereferensikan suatu objek di Cloud Storage.

// Create a reference with an initial file path and name
StorageReference path_reference = storage->GetReference("images/stars.jpg");

// Create a reference from a Google Cloud Storage URI
StorageReference gs_reference = storage->GetReferenceFromUrl("gs://bucket/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
StorageReference https_reference = storage->GetReferenceFromUrl("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");

Mendownload File

Setelah memiliki referensi, Anda dapat mendownload file dari Cloud Storage dengan tiga cara:

  1. Mendownload ke buffering di memori
  2. Mendownload ke lokasi tertentu di perangkat
  3. Membuat URL string yang mewakili file online

Mendownload di memori

Download file ke buffering byte di memori menggunakan metode GetBytes(). Ini adalah cara termudah untuk mendownload file dengan cepat, tetapi cara ini akan memuat seluruh konten file Anda ke dalam memori. Jika Anda meminta file yang lebih besar dari memori yang tersedia, aplikasi akan berhenti bekerja. Agar tidak terjadi masalah pada memori, pastikan untuk menyetel ukuran maksimum dengan nilai yang Anda tahu bisa ditangani oleh aplikasi ini atau gunakan metode download lainnya.

// Create a reference to the file you want to download
StorageReference island_ref = storage_ref.Child("images/island.jpg");

// Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
const size_t kMaxAllowedSize = 1 * 1024 * 1024
int8_t byte_buffer[kMaxAllowedSize];
firebase::Future future = island_ref.GetBytes(byte_buffer, kMaxAllowedSize);

Pada saat itu, permintaan telah dibuat, tetapi harus menunggu Future selesai untuk dapat membaca nilai. Karena game biasanya dijalankan dalam loop, dan kurang digerakkan callback dibanding aplikasi lain, Anda biasanya akan menanyakan penyelesaian.

// In the game loop that polls for the result...

if (future.status() != firebase::kFutureStatusPending) {
  if (future.status() != firebase::kFutureStatusComplete) {
    LogMessage("ERROR: GetBytes() returned an invalid future.");
    // Handle the error...
  } else if (future.Error() != firebase::storage::kErrorNone) {
    LogMessage("ERROR: GetBytes() returned error %d: %s", future.Error(),
               future.error_message());
    // Handle the error...
  } else {
    // byte_buffer is now populated with data for "images/island.jpg"
  }
}

Mendownload ke file lokal

Metode GetFile() akan mendownload file secara langsung ke perangkat lokal. Gunakan metode ini jika pengguna ingin mengakses file ketika sedang offline atau membagikan file ke aplikasi lain.

// Create a reference to the file you want to download
StorageReference islandRef = storage_ref.Child("images/island.jpg"];

// Create local filesystem URL
const char* local_url = "file:///local/images/island.jpg";

// Download to the local filesystem
Future future = islandRef.GetFile(local_url);

// Wait for Future to complete...

if (future.Error() != firebase::storage::kErrorNone) {
  // Uh-oh, an error occurred!
} else {
  // The file has been downloaded to local file URL "images/island.jpg"
}

GetFile() menggunakan argumen Controller opsional yang dapat Anda gunakan untuk mengelola download. Baca bagian Mengelola Download untuk mengetahui informasi lebih lanjut.

Membuat URL download

Jika Anda sudah memiliki infrastruktur download berbasis beberapa URL, atau hanya ingin satu URL untuk dibagikan, Anda dapat memperoleh URL download ke suatu file dengan memanggil metode GetDownloadUrl() pada referensi penyimpanan.

// Create a reference to the file you want to download
StorageReference stars_ref = storage_ref.Child("images/stars.jpg");

// Fetch the download URL
firebase::Future future = stars_ref.GetDownloadUrl();

// Wait for Future to complete...

if (future.Error() != firebase::storage::kErrorNone) {
  // Uh-oh, an error occurred!
} else {
  // Get the download URL for 'images/stars.jpg'
  std::string download_url = future.Result();
}

Mengelola Download

Selain memulai download, Anda dapat menjeda, melanjutkan, dan membatalkan download menggunakan metode Pause(), Resume(), dan Cancel() di Controller, yang dapat Anda teruskan secara opsional ke metode GetBytes() atau GetFile().

// Start downloading a file
Controller controller;
storage_ref.Child("images/mountains.jpg").GetFile(local_file, nullptr, &controller);

// Pause the download
controller.Pause();

// Resume the download
controller.Resume();

// Cancel the download
controller.Cancel();

Memantau Progres Download

Anda dapat menempelkan listener ke download untuk memantau prosesnya.

class MyListener : public firebase::storage::Listener {
 public:
  virtual void OnProgress(firebase::storage::Controller* controller) {
    // A progress event occurred
  }
};

{
  // Start uploading a file
  MyEventListener my_listener;
  storage_ref.Child("images/mountains.jpg").GetFile(local_file, my_listener);
}

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 dapat ditemukan di bagian Menangani Error pada dokumen.

Langkah Berikutnya

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