Sube archivos con Cloud Storage para Unity

Cloud Storage para Firebase te permite subir archivos con rapidez y facilidad a un bucket de 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 ello, puedes anexar rutas de acceso secundarias a la raíz de tu bucket 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 root reference
StorageReference storageRef = storage.RootReference;

// Create a reference to "mountains.jpg"
StorageReference mountainsRef = storageRef.Child("mountains.jpg");

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

// While the file names are the same, the references point to different files
Assert.AreEqual(mountainsRef.Name, mountainImagesRef.Name);
Assert.AreNotEqual(mountainsRef.Path, mountainImagesRef.Path);

No puedes subir datos con una referencia a la raíz del bucket de Google Cloud Storage. La 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 forma más simple de subir un archivo a Cloud Storage. PutBytesAsync() recibe un byte[] y arroja un System.Task<Firebase.Storage.StorageMetadata>, que contendrá información acerca del 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 customBytes = new byte[] {
    /*...*/
};

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

// Upload the file to the path "images/rivers.jpg"
riversRef.PutBytesAsync(customBytes)
    .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 md5hash.
            StorageMetadata metadata = task.Result;
            string md5Hash = metadata.Md5Hash;
            Debug.Log("Finished uploading...");
            Debug.Log("md5 hash = " + md5Hash);
        }
    });

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 obtiene 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 localFile = "...";

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

// Upload the file to the path "images/rivers.jpg"
riversRef.PutFileAsync(localFile)
    .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.
            StorageMetadata metadata = task.Result;
            string md5Hash = metadata.Md5Hash;
            Debug.Log("Finished uploading...");
            Debug.Log("md5 hash = " + md5Hash);
        }
    });

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 típicas de metadatos de archivo, como Name, Size y ContentType (comúnmente denominadas tipos de 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 un tipo predeterminado a partir de una extensión de archivo, Cloud Storage usará application/octet-stream. Consulta la sección Usa metadatos de archivo para obtener más información acerca de estos.

// Create storage reference
StorageReference mountainsRef = storageRef.Child("images/mountains.jpg");

byte[] customBytes = new byte[] {
    /*...*/
};
string localFile = "...";

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

// Upload data and metadata
mountainsRef.PutBytesAsync(customBytes, newMetadata, null,
    CancellationToken.None); // .ContinueWithOnMainThread(...
// Upload file and metadata
mountainsRef.PutFileAsync(localFile, newMetadata, null,
    CancellationToken.None); // .ContinueWithOnMainThread(...

Controla el progreso de la carga

Puedes adjuntar objetos de escucha a las cargas para monitorear su progreso. El objeto de escucha sigue la interfaz estándar System.IProgress<T>. Puedes usar una instancia de la clase StorageProgress a fin de proporcionar tu propia Action<T> como devolución de llamada para las marcas de progreso.

// Start uploading a file
var task = storageRef.Child("images/mountains.jpg")
    .PutFileAsync(localFile, null,
        new 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.ContinueWithOnMainThread(resultTask => {
    if (!resultTask.IsFaulted && !resultTask.IsCanceled) {
        Debug.Log("Upload finished.");
    }
});

Soluciona 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.