Descarga archivos con Cloud Storage para Unity

Cloud Storage permite a los programadores descargar archivos con rapidez y facilidad desde un depósito de Google 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 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 reference with an initial file path and name
Firebase.Storage.StorageReference path_reference =
  storage.GetReference("images/stars.jpg");

// Create a reference from a Google Cloud Storage URI
Firebase.Storage.StorageReference gs_reference =
  storage.GetReferenceFromUrl("gs://bucket/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
Firebase.Storage.StorageReference https_reference =
  storage.GetReferenceFromUrl("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");

Descarga archivos

Los archivos que se almacenan en Cloud Storage pueden recuperarse de cuatro maneras:

  1. descarga desde una URL
  2. descarga a una matriz de bytes
  3. descarga con una trasmisión continua
  4. 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 deseas usar una URL con WWWUnityWebRequest de Unity, puedes llamar a GetDownloadUrlAsync() para obtener una URL de descarga de un archivo.

// Fetch the download URL
reference.GetDownloadUrlAsync().ContinueWith((Task<Uri> task) => {
  if (!task.IsFaulted && !task.IsCanceled) {
    Debug.Log("Download URL: " + task.Result());
    // ... now download the file via WWW or UnityWebRequest.
  }
});

Descarga a una matriz 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).ContinueWith((Task<byte[]> task) => {
  if (task.IsFaulted || task.IsCanceled) {
    Debug.Log(task.Exception.ToString());
    // 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 transmisiones continuas como primer argumento. El llamado a este delegado se realizará en un subproceso en segundo plano con una transmisión continua, 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 la transmisión continua 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 a 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 local_url = "file:///local/images/island.jpg";

// Download to the local filesystem
reference.GetFileAsync(local_url).ContinueWith(task => {
    if (!task.IsFaulted && !task.IsCanceled) {
        Debug.Log("File downloaded.");
    }
});

Puedes vincular agentes de escucha a las descargas para supervisar 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.

// Create local filesystem URL
string local_url = "file:///local/images/island.jpg";

// Start downloading a file
Task task = reference.GetFileAsync(local_file,
  new Firebase.Storage.StorageProgress <DownloadState>((DownloadState state) => {
    // called periodically during the download
    Debug.Log(String.Format(
      "Progress: {0} of {1} bytes transferred.",
      state.BytesTransferred,
      state.TotalByteCount
    ));
  }), CancellationToken.None);

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

Soluciona errores

Existen varios motivos por los cuales pueden ocurrir 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.

Pasos siguientes

También puedes obtener y actualizar metadatos para los archivos almacenados en Cloud Storage.

Enviar comentarios sobre…

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