Télécharger des fichiers avec Cloud Storage pour C++

Cloud Storage for Firebase vous permet de télécharger rapidement et facilement des fichiers à partir d'un bucket Cloud Storage fourni et géré par Firebase.

Créer une référence

Pour télécharger un fichier, commencez par créer une référence Cloud Storage au fichier que vous souhaitez télécharger.

Vous pouvez créer une référence en ajoutant des chemins d'accès enfants à la racine de votre bucket Cloud Storage, ou à partir d'une URL gs:// ou https:// existante référençant un objet dans 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 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");

Télécharger les fichiers

Une fois que vous disposez d'une référence, vous pouvez télécharger des fichiers depuis Cloud Storage de trois manières différentes:

  1. Télécharger dans un tampon en mémoire
  2. Télécharger vers un chemin d'accès spécifique sur l'appareil
  3. Générer une URL de chaîne représentant le fichier en ligne

Télécharger en mémoire

Téléchargez le fichier dans un tampon d'octets en mémoire à l'aide de la méthode GetBytes(). Il s'agit du moyen le plus simple de télécharger rapidement un fichier, mais il doit charger l'intégralité du contenu de votre fichier en mémoire. Si vous demandez un fichier plus volumineux que la mémoire disponible de votre application, celle-ci plantera. Pour vous protéger contre les problèmes de mémoire, assurez-vous de définir la taille maximale sur une valeur que votre application peut gérer ou utilisez une autre méthode de téléchargement.

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

Au moment où la requête a été effectuée, nous devons attendre la fin de la Future avant de pouvoir lire le fichier. Étant donné que les jeux s'exécutent généralement en boucle et sont moins basés sur les rappels que les autres applications, vous effectuez généralement une requête pour vérifier l'achèvement.

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

Télécharger dans un fichier local

La méthode GetFile() télécharge un fichier directement sur un appareil local. Utilisez cette option si vos utilisateurs souhaitent accéder au fichier hors connexion ou le partager dans une autre application.

// 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() accepte un argument Controller facultatif que vous pouvez utiliser pour gérer votre téléchargement. Pour en savoir plus, consultez la section Gérer les téléchargements.

Générer une URL de téléchargement

Si vous disposez déjà d'une infrastructure de téléchargement basée sur des URL ou si vous souhaitez simplement partager une URL, vous pouvez obtenir l'URL de téléchargement d'un fichier en appelant la méthode GetDownloadUrl() sur une référence Cloud Storage.

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

Gérer les téléchargements

En plus de démarrer des téléchargements, vous pouvez suspendre, reprendre et annuler des téléchargements à l'aide des méthodes Pause(), Resume() et Cancel() sur Controller, que vous pouvez éventuellement transmettre aux méthodes GetBytes() ou 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();

Surveiller la progression du téléchargement

Vous pouvez associer des écouteurs aux téléchargements afin de surveiller leur progression.

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

Gérer les erreurs

Plusieurs raisons peuvent expliquer l'apparition d'erreurs lors du téléchargement, y compris l'absence de fichier ou l'absence d'autorisation de l'utilisateur pour accéder au fichier souhaité. Pour en savoir plus sur les erreurs, consultez la section Gérer les erreurs de la documentation.

Étapes suivantes

Vous pouvez également obtenir et mettre à jour des métadonnées pour les fichiers stockés dans Cloud Storage.