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:
- Cargar desde un búfer de bytes en la memoria
- 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" Futurefuture = 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" Futurefuture = 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.