Cargar archivos con Cloud Storage para C++

Cloud Storage para Firebase le permite cargar archivos de forma rápida y sencilla a un depósito de Cloud Storage proporcionado y administrado por Firebase.

Crear una referencia

Para cargar un archivo, primero cree una referencia de Cloud Storage a la ubicación en Cloud Storage donde desea cargar el archivo.

Puedes crear una referencia agregando rutas secundarias a la raíz de tu depósito de Cloud Storage:

// Create a root reference
StorageReference storage_ref = storage->GetReference();

// Create a reference to "mountains.jpg"
StorageReference mountains_ref = storage_ref.Child("mountains.jpg");

// Create a reference to 'images/mountains.jpg'
StorageReference mountain_images_ref = storage_ref.Child("images/mountains.jpg");

// While the file names are the same, the references point to different files
mountains_ref.name() == mountain_images_ref.name();           // true
mountains_ref.full_path() == mountain_images_ref.full_path(); // false

No puedes cargar datos con una referencia a la raíz de tu depósito de Cloud Storage. Su referencia debe apuntar a una URL secundaria.

Subir archivos

Una vez que tengas una referencia, podrás subir archivos a Cloud Storage de dos maneras:

  1. Cargar desde un búfer de bytes en la memoria
  2. Cargar desde una ruta de archivo que representa un archivo en el dispositivo

Cargar desde datos en la memoria

El método PutData() es la forma más sencilla de cargar un archivo en Cloud Storage. PutData() toma un búfer de bytes y devuelve un Future<Metadata> que contendrá información sobre el archivo cuando se complete el Future. Puede utilizar un Controller para administrar su carga y monitorear su estado.

// Data in memory
const size_t kByteBufferSize = ...
uint8_t byte_buffer[kByteBufferSize] = { ... };

// Create a reference to the file you want to upload
StorageReference rivers_ref = storage_ref.Child("images/rivers.jpg");

// Upload the file to the path "images/rivers.jpg"
Future future = rivers_ref.PutBytes(byte_buffer, kByteBufferSize);

En ese momento se realizó la solicitud, pero tenemos que esperar a que se complete el futuro antes de cargar 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.

if (future.status() != firebase::kFutureStatusPending) {
  if (future.status() != firebase::kFutureStatusComplete) {
    LogMessage("ERROR: GetData() returned an invalid future.");
    // Handle the error...
  } else if (future.Error() != firebase::storage::kErrorNone) {
    LogMessage("ERROR: GetData() returned error %d: %s", future.Error(),
               future.error_message());
    // Handle the error...
    }
  } else {
    // Metadata contains file metadata such as size, content-type, and download URL.
    Metadata* metadata = future.Result();
    std::string download_url = metadata->download_url();
  }
}

Subir desde un archivo local

Puede cargar archivos locales en los dispositivos, como fotos y vídeos de la cámara, con el método PutFile() . PutFile() toma un std::string que representa la ruta al archivo y devuelve un Future<Metadata> que contendrá información sobre el archivo cuando se complete el Future. Puede utilizar un Controller para administrar su carga y monitorear su estado.

// File located on disk
std::string local_file = ...

// Create a reference to the file you want to upload
StorageReference rivers_ref = storage_ref.Child("images/rivers.jpg");

// Upload the file to the path "images/rivers.jpg"
Future future = rivers_ref.PutFile(localFile);

// Wait for Future to complete...

if (future.Error() != firebase::storage::kErrorNone) {
  // Uh-oh, an error occurred!
} else {
  // Metadata contains file metadata such as size, content-type, and download URL.
  Metadata* metadata = future.Result();
  std::string download_url = metadata->download_url();
}

Si desea administrar activamente su carga, puede proporcionar un Controller a los métodos PutFile() o PutBytes() . Esto le permite utilizar el controlador para observar la operación de carga en curso. Consulte Administrar cargas para obtener más información.

Agregar metadatos de archivo

También puedes incluir metadatos cuando subes archivos. Estos metadatos contienen propiedades típicas de metadatos de archivos, como name , size y content_type (comúnmente denominado tipo MIME). El método PutFile() infiere automáticamente el tipo de contenido a partir de la extensión del nombre de archivo, pero puede anular el tipo detectado automáticamente especificando content_type en los metadatos. Si no proporciona un content_type y Cloud Storage no puede inferir un valor predeterminado a partir de la extensión del archivo, Cloud Storage usa application/octet-stream . Consulte la sección Usar metadatos de archivos para obtener más información sobre los metadatos de archivos.

// Create storage reference
StorageReference mountains_ref = storage_ref.Child("images/mountains.jpg");

// Create file metadata including the content type
StorageMetadata metadata;
metadata.set_content_type("image/jpeg");

// Upload data and metadata
mountains_ref.PutBytes(data, metadata);

// Upload file and metadata
mountains_ref.PutFile(local_file, metadata);

Administrar cargas

Además de iniciar las cargas, puede pausar, reanudar y cancelar las cargas utilizando los métodos Pause() , Resume() y Cancel() en Controller , que opcionalmente puede pasar a los métodos PutBytes() o PutFile() .

// Start uploading a file
firebase::storage::Controller controller;
storage_ref.Child("images/mountains.jpg").PutFile(local_file, nullptr, &controller);

// Pause the upload
controller.Pause();

// Resume the upload
controller.Resume();

// Cancel the upload
controller.Cancel();

Supervisar el progreso de la carga

Puede adjuntar oyentes a las cargas para monitorear el progreso de la carga.

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").PutFile(local_file, my_listener);
}

Manejo de errores

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

Próximos pasos

Ahora que has subido archivos, aprendamos cómo descargarlos desde Cloud Storage.