Cloud Storage for Firebase te permite descargar contenido de forma rápida y sencilla archivos de un bucket de Cloud Storage que proporciona y administra Firebase.
Crea una referencia
Para descargar un archivo, primero crea una referencia de Cloud Storage al archivo que deseas descargar.
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 reference with an initial file path and name StorageReference pathReference = storage.GetReference("images/stars.jpg"); // Create a reference from a Google Cloud Storage URI StorageReference gsReference = storage.GetReferenceFromUrl("gs://bucket/images/stars.jpg"); // Create a reference from an HTTPS URL // Note that in the URL, characters are URL escaped! StorageReference httpsReference = storage.GetReferenceFromUrl("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");
Descarga archivos
Cuando tengas una referencia, podrás descargar archivos de Cloud Storage de cuatro maneras:
- Descarga desde una URL
- Descarga a un arreglo de bytes
- Descarga con una trasmisión continua
- Descarga en un archivo local
El método que uses para recuperar los archivos dependerá de cómo quieras usar los datos en tu juego.
Descarga desde una URL
Si quieres usar una URL con las clases WWW
o UnityWebRequest
de Unity, puedes llamar a GetDownloadUrlAsync()
para obtener una URL de descarga de un archivo.
// Fetch the download URL reference.GetDownloadUrlAsync().ContinueWithOnMainThread(task => { if (!task.IsFaulted && !task.IsCanceled) { Debug.Log("Download URL: " + task.Result); // ... now download the file via WWW or UnityWebRequest. } });
Descarga a un arreglo de bytes
Puedes descargar el archivo en un búfer de bytes en la memoria mediante el método GetBytesAsync()
.
Este método carga todo el contenido del archivo en la memoria.
Si solicitas la descarga de un archivo más grande que la memoria disponible de tu app, esta fallará.
Para brindar protección contra problemas de memoria, asegúrate de configurar el tamaño máximo en un valor que sepas que puede controlar la aplicación, o usa otro método de descarga.
// Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes) const long maxAllowedSize = 1 * 1024 * 1024; reference.GetBytesAsync(maxAllowedSize).ContinueWithOnMainThread(task => { if (task.IsFaulted || task.IsCanceled) { Debug.LogException(task.Exception); // Uh-oh, an error occurred! } else { byte[] fileContents = task.Result; Debug.Log("Finished downloading!"); } });
Descarga mediante una transmisión continua
Si descargas el archivo mediante una transmisión continua, podrás procesar los datos a medida que se cargan.
Esto te permite manejar la descarga con la máxima flexibilidad posible. Llama a GetStreamAsync()
y pásale tu propio procesador de transmisión como primer argumento.
El llamado a este delegado se realizará en un subproceso en segundo plano con una transmisión, lo cual te permite realizar operaciones con alta exigencia en términos de latencia o cálculos como almacenar el contenido en el disco.
// Download via a Stream reference.GetStreamAsync(stream => { // Do something with the stream here. // // This code runs on a background thread which reduces the impact // to your framerate. // // If you want to do something on the main thread, you can do that in the // progress eventhandler (second argument) or ContinueWith to execute it // at task completion. }, null, CancellationToken.None);
GetStreamAsync()
acepta un argumento opcional después del procesador de transmisión que te permite cancelar la operación o recibir notificaciones del progreso.
Descarga en un archivo local
El método GetFileAsync()
permite descargar un archivo directamente en un dispositivo local. Úsalo si tus usuarios quieren tener acceso al archivo sin conexión o compartirlo en otra app.
// Create local filesystem URL string localUrl = "file:///local/images/island.jpg"; // Download to the local filesystem reference.GetFileAsync(localUrl).ContinueWithOnMainThread(task => { if (!task.IsFaulted && !task.IsCanceled) { Debug.Log("File downloaded."); } });
Puedes vincular objetos de escucha a las descargas para supervisar 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.
// Create local filesystem URL string localUrl = "file:///local/images/island.jpg"; // Start downloading a file Task task = reference.GetFileAsync(localFile, new StorageProgress<DownloadState>(state => { // called periodically during the download Debug.Log(String.Format( "Progress: {0} of {1} bytes transferred.", state.BytesTransferred, state.TotalByteCount )); }), CancellationToken.None); task.ContinueWithOnMainThread(resultTask => { if (!resultTask.IsFaulted && !resultTask.IsCanceled) { Debug.Log("Download finished."); } });
Soluciona errores
Existen varios motivos por los cuales se pueden producir errores en una descarga: por ejemplo, es posible que el archivo no exista o que el usuario no tenga permiso para acceder al archivo deseado. Para obtener más información sobre los errores, consulta la sección de los documentos denominada Soluciona errores.
Próximos pasos
También puedes obtener y actualizar metadatos para los archivos almacenados en Cloud Storage.