Sube archivos con Cloud Storage para Unity

Cloud Storage permite a los programadores subir archivos con rapidez y facilidad a un depósito de Google Cloud Storage proporcionado y administrado por Firebase.

Crea una referencia

Para subir un archivo, primero crea una referencia de Cloud Storage al archivo que deseas subir.

Para crear una referencia, puedes anexar rutas secundarias a la raíz del almacenamiento o puedes crear una referencia a partir de una URL gs:// o https:// existente que haga referencia a un objeto de Cloud Storage.

// Create a root reference
Firebase.Storage.StorageReference storage_ref = storage.Reference();

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

// Create a reference to 'images/mountains.jpg'
Firebase.Storage.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.Path == mountain_images_ref.Path; // false

No puedes subir datos sin una referencia a la raíz de tu depósito de Google Cloud Storage. Tu referencia debe apuntar a una URL secundaria.

Sube archivos

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

  1. Subir desde un arreglo de bytes en la memoria.
  2. Subir desde una ruta de archivo que represente un archivo en el dispositivo.

Sube archivos desde datos en la memoria

El método PutBytesAsync() es la manera más simple de subir un archivo a Cloud Storage. PutBytesAsync() toma un byte[] y muestra un System.Task<Firebase.Storage.StorageMetadata> que contendrá información sobre el archivo cuando se complete la tarea. De forma opcional, puedes usar un IProgress<UploadState> (por lo general StorageProgress<UploadState>) para supervisar el estado de tu carga.

// Data in memory
var custom_bytes = new byte[] { ... };

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

// Upload the file to the path "images/rivers.jpg"
rivers_ref.PutBytesAsync(custom_bytes)
  .ContinueWith ((Task<StorageMetadata> task) => {
    if (task.IsFaulted || task.IsCanceled) {
        Debug.Log(task.Exception.ToString());
        // Uh-oh, an error occurred!
    } else {
        // Metadata contains file metadata such as size, content-type, and download URL.
        Firebase.Storage.StorageMetadata metadata = task.Result;
        string download_url = metadata.DownloadUrl.ToString();
        Debug.Log("Finished uploading...");
        Debug.Log("download url = " + download_url);
    }
});

Sube archivos desde un archivo local

Puedes usar el método PutFileAsync() para subir archivos locales de los dispositivos, como fotos y videos de la cámara. PutFileAsync() toma una string que representa la ruta al archivo y muestra un System.Task<Firebase.Storage.StorageMetadata> que contendrá información sobre el archivo cuando se complete la tarea. De forma opcional, puedes usar un IProgress<UploadState> (por lo general StorageProgress<UploadState>) para supervisar el estado de tu carga.

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

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

// Upload the file to the path "images/rivers.jpg"
rivers_ref.PutFileAsync(local_file)
  .ContinueWith ((Task<StorageMetadata> task) => {
    if (task.IsFaulted || task.IsCanceled) {
      Debug.Log(task.Exception.ToString());
      // Uh-oh, an error occurred!
    } else {
      // Metadata contains file metadata such as size, content-type, and download URL.
      Firebase.Storage.StorageMetadata metadata = task.Result;
      string download_url = metadata.DownloadUrl.ToString();
      Debug.Log("Finished uploading...");
      Debug.Log("download url = " + download_url);
    }
  });

Si deseas supervisar la carga de forma activa, puedes usar una clase StorageProgress o tu propia clase que implementa IProgress<UploadState>, con los métodos PutFileAsync() o PutBytesAsync(). Consulta cómo administrar cargas para obtener más información.

Agrega metadatos de archivos

También puedes incluir metadatos cuando subas archivos. Estos metadatos contienen propiedades de metadatos de archivos típicas, como Name, Size y ContentType (comúnmente denominada como tipo MIME). El método PutFileAsync() infiere el tipo de contenido de forma automática a partir de la extensión del nombre de archivo, pero puedes especificar ContentType en los metadatos para anular el tipo detectado de manera automática. Si no proporcionas un ContentType y Cloud Storage no puede inferir una configuración predeterminada a partir de la extensión del archivo, Cloud Storage usa application/octet-stream. Consulta la sección Usa metadatos de archivo para ver más información acerca de los metadatos de archivos.

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

var custom_bytes = new byte[] { ... };

// Create file metadata including the content type
var new_metadata = new Firebase.Storage.MetadataChange();
new_metadata.ContentType = "image/jpeg";

// Upload data and metadata
mountains_ref.PutBytesAsync(custom_bytes, new_metadata, null,
                            CancellationToken.None, null);  // .ContinueWith(...
// Upload file and metadata
mountains_ref.PutFileAsync(local_file, new_metadata, null,
                           CancellationToken.None, null);  // .ContinueWith(...

Controla el progreso de la carga

Puedes adjuntar agentes de escucha a las cargas para monitorear su progreso. El agente de escucha sigue la interfaz estándar System.IProgress<T>. Puedes usar una instancia de la clase StorageProgress para ofrecer tu propio Action<T> como devolución de llamada para los indicadores de progreso.

// Start uploading a file
var task = storage_ref.Child("images/mountains.jpg")
    .PutFileAsync(local_file, null,
      new Firebase.Storage.StorageProgress<UploadState>(state => {
          // called periodically during the upload
          Debug.Log(String.Format("Progress: {0} of {1} bytes transferred.",
                             state.BytesTransferred, state.TotalByteCount));
      }), CancellationToken.None, null);

task.ContinueWith(resultTask => {
    if (!resultTask.IsFaulted && !resultTask.IsCancelled) {
        Debug.Log("Upload finished.");
    }
});

Manejo de errores

Existen diferentes motivos por los que pueden producirse errores durante la carga, como que el archivo local no exista o que el usuario no tenga permiso para subir el archivo deseado. Para obtener más información sobre los errores, consulta la sección de los documentos denominada Soluciona errores.

Próximos pasos

Ahora que ya subiste archivos, veamos cómo descargarlos de Cloud Storage.

Enviar comentarios sobre…

¿Necesitas ayuda? Visita nuestra página de asistencia.