C++ için Cloud Storage ile dosya indirme

Cloud Storage for Firebase, Firebase tarafından sağlanan ve yönetilen bir Cloud Storage paketinden dosyaları hızlı ve kolay bir şekilde indirmenize olanak tanır.

Referans Oluşturma

Bir dosyayı indirmek için önce indirmek istediğiniz dosyaya Cloud Storage referans oluşturun.

Alt yolları Cloud Storage paketinize ekleyerek referans oluşturabilir veya Cloud Storage içindeki bir nesneye referans veren mevcut bir gs:// ya da https:// URL'den referans oluşturabilirsiniz.

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

// Create a reference from a 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");

Dosyaları İndir

Referansınız olduğunda Cloud Storage dosyalarını üç şekilde indirebilirsiniz:

  1. Bellekteki bir arabelleğe indirme
  2. Cihazda belirli bir yola indirme
  3. Dosyayı online olarak temsil eden bir dize URL oluşturun

Belleğe indirme

GetBytes() yöntemini kullanarak dosyayı bellekteki bir bayt arabelleğine indirin. Bu, dosyaları hızlı bir şekilde indirmenin en kolay yoludur ancak dosyanızın tüm içeriğinin belleğe yüklenmesi gerekir. Uygulamanızın kullanılabilir belleğinden daha büyük bir dosya isteğinde bulunursanız uygulamanız çöker. Bellek sorunlarına karşı koruma sağlamak için maksimum boyutu uygulamanızın işleyebileceği bir değere ayarladığınızdan veya başka bir indirme yöntemi kullandığınızdan emin olun.

// 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<size_t> future = island_ref.GetBytes(byte_buffer, kMaxAllowedSize);

İstek yapıldı ancak dosyayı okuyabilmek için Future'ın tamamlanmasını beklememiz gerekiyor. Oyunlar genellikle döngü içinde çalıştığından ve diğer uygulamalara kıyasla daha az geri çağırma odaklı olduğundan, genellikle tamamlanma için yoklama yaparsınız.

// 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"
  }
}

Yerel bir dosyaya indirme

GetFile() yöntemi, dosyayı doğrudan yerel bir cihaza indirir. Kullanıcılarınız dosyaya çevrimdışıyken erişmek veya dosyayı farklı bir uygulamada paylaşmak istiyorsa bu yöntemi kullanın.

// 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<size_t> 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(), indirme işleminizi yönetmek için kullanabileceğiniz isteğe bağlı bir Controller bağımsız değişkeni alır. Daha fazla bilgi için İndirmeleri Yönetme başlıklı makaleyi inceleyin.

İndirme URL'si oluşturma

URL'lere dayalı bir indirme altyapınız varsa veya yalnızca paylaşmak için bir URL istiyorsanız GetDownloadUrl() referansında Cloud Storage yöntemini çağırarak bir dosyanın indirme URL'sini alabilirsiniz.

// 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<std::string> 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();
}

İndirilenleri yönetme

İndirme işlemlerini başlatmanın yanı sıra Controller üzerindeki Pause(), Resume() ve Cancel() yöntemlerini kullanarak indirme işlemlerini duraklatabilir, devam ettirebilir ve iptal edebilirsiniz. Bu yöntemleri isteğe bağlı olarak GetBytes() veya GetFile() yöntemlerine de aktarabilirsiniz.

// 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();

İndirme işleminin ilerleme durumunu izleme

İndirme işlemlerinin ilerleme durumunu izlemek için indirme işlemlerine dinleyiciler ekleyebilirsiniz.

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

Hataları İşleme

İndirme sırasında hataların oluşmasının birkaç nedeni vardır. Örneğin, dosya mevcut olmayabilir veya kullanıcının istenen dosyaya erişme izni olmayabilir. Hatalar hakkında daha fazla bilgiyi dokümanların Hataları İşleme bölümünde bulabilirsiniz.

Sonraki adımlar

Ayrıca, Cloud Storage'da depolanan dosyalar için meta verileri alıp güncelleyebilirsiniz.