Descargar archivos con Cloud Storage para C++

Cloud Storage para Firebase le permite descargar archivos rápida y fácilmente desde un depósito de Cloud Storage proporcionado y administrado por Firebase.

Crear una referencia

Para descargar un archivo, primero cree una referencia de Cloud Storage para el archivo que desea descargar.

Puedes crear una referencia agregando rutas secundarias a la raíz de tu depósito de Cloud Storage, o puedes crear una referencia a partir de una URL gs:// o https:// existente que haga referencia a un objeto en 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");

Descargar archivos

Una vez que tengas una referencia, podrás descargar archivos desde Cloud Storage de tres maneras:

  1. Descargar a un buffer en la memoria
  2. Descargar a una ruta específica en el dispositivo
  3. Genere una URL de cadena que represente el archivo en línea

Descargar en memoria

Descargue el archivo a un búfer de bytes en la memoria usando el método GetBytes() . Esta es la forma más sencilla de descargar rápidamente un archivo, pero debe cargar el contenido completo del archivo en la memoria. Si solicita un archivo más grande que la memoria disponible de su aplicación, su aplicación fallará. Para protegerse contra problemas de memoria, asegúrese de establecer el tamaño máximo en algo que sepa que su aplicación puede manejar o utilice otro método de descarga.

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

En ese momento se realizó la solicitud, pero tenemos que esperar a que se complete el Futuro antes de poder leer el archivo. Dado que los juegos generalmente se ejecutan en un bucle y se basan menos en la devolución de llamadas que otras aplicaciones, normalmente realizarás una encuesta para completarlos.

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

Descargar a un archivo local

El método GetFile() descarga un archivo directamente a un dispositivo local. Úselo si sus usuarios desean tener acceso al archivo sin conexión o compartirlo en una aplicación diferente.

// 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() toma un argumento Controller opcional que puede usar para administrar su descarga. Consulte Administrar descargas para obtener más información.

Generar una URL de descarga

Si ya tiene una infraestructura de descarga basada en URL, o simplemente desea compartir una URL, puede obtener la URL de descarga de un archivo llamando al método GetDownloadUrl() en una referencia de 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 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();
}

Administrar descargas

Además de iniciar descargas, puede pausar, reanudar y cancelar descargas utilizando los métodos Pause() , Resume() y Cancel() en Controller , que opcionalmente puede pasar a los métodos GetBytes() o 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();

Supervisar el progreso de la descarga

Puede adjuntar oyentes a las descargas para monitorear el progreso de la descarga.

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

Manejar errores

Hay varias razones por las que pueden ocurrir errores durante la descarga, incluido el archivo que no existe o que el usuario no tiene permiso para acceder al archivo deseado. Puede encontrar más información sobre errores en la sección Manejar errores de los documentos.

Próximos pasos

También puede obtener y actualizar metadatos de archivos almacenados en Cloud Storage.