Cargar archivos con Cloud Storage para Unity

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 para el archivo que desea cargar.

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 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 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 una matriz 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 PutBytesAsync() es la forma más sencilla de cargar un archivo en Cloud Storage. PutBytesAsync() toma un byte[] y devuelve System.Task<Firebase.Storage.StorageMetadata> que contendrá información sobre el archivo cuando se complete la tarea. Opcionalmente, puedes usar un IProgress<UploadState> (normalmente StorageProgress<UploadState> ) para monitorear tu estado de 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);
        }
    });

Subir desde un archivo local

Puede cargar archivos locales en los dispositivos, como fotos y videos de la cámara, con el método PutFileAsync() . PutFileAsync() toma una string que representa la ruta al archivo y devuelve System.Task<Firebase.Storage.StorageMetadata> que contendrá información sobre el archivo cuando se complete la tarea. Opcionalmente, puedes usar un IProgress<UploadState> (normalmente StorageProgress<UploadState> ) para monitorear tu estado de 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 desea monitorear activamente su carga, puede usar una clase StorageProgress o su propia clase que implemente IProgress<UploadState> , con los métodos PutFileAsync() o PutBytesAsync() . 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 ContentType (comúnmente denominado tipo MIME). El método PutFileAsync() infiere automáticamente el tipo de contenido a partir de la extensión del nombre de archivo, pero puedes anular el tipo detectado automáticamente especificando ContentType en los metadatos. Si no proporciona un ContentType 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 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(...

Supervisar el progreso de la carga

Puede adjuntar oyentes a las cargas para monitorear el progreso de la carga. El oyente sigue la interfaz estándar System.IProgress<T> . Puede utilizar una instancia de la clase StorageProgress para proporcionar su propia Action<T> como devolución de llamada para los ticks 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.");
    }
});

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.