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 lokasi turunan ke root penyimpanan, atau membuat referensi dari URL gs:// atau https:// yang sudah ada, yang mereferensikan 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, tapi 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 file ke perangkat lokal

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

// 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() membutuhkan argumen Controller opsional yang bisa Anda gunakan untuk mengelola download. Lihat Mengelola Download untuk informasi lebih lanjut.

Membuat URL download

Jika Anda sudah mendownload infrastruktur berbasis URL, atau hanya ingin URL untuk berbagi, Anda bisa mendapatkan URL download untuk 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() pada 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 Kemajuan 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 mengapa terjadi error saat download, termasuk file tidak ada atau karena 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.

Kirim masukan tentang...

Butuh bantuan? Kunjungi halaman dukungan kami.