Descargar archivos con Cloud Storage en Flutter

Cloud Storage para Firebase le permite descargar archivos rápida y fácilmente desde un depósito de Cloud Storage proporcionado y administrado por Firebase.

Crear una referencia

Para descargar un archivo, primero cree una referencia de Cloud Storage para el archivo que desea descargar.

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 storage reference from our app
final storageRef = FirebaseStorage.instance.ref();

// Create a reference with an initial file path and name
final pathReference = storageRef.child("images/stars.jpg");

// Create a reference to a file from a Google Cloud Storage URI
final gsReference =
    FirebaseStorage.instance.refFromURL("gs://YOUR_BUCKET/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
final httpsReference = FirebaseStorage.instance.refFromURL(
    "https://firebasestorage.googleapis.com/b/YOUR_BUCKET/o/images%20stars.jpg");

Descargar archivos

Una vez que tenga una referencia, puede descargar archivos de Cloud Storage llamando a getData() o getStream() . Si prefiere descargar el archivo con otra biblioteca, puede obtener una URL de descarga con getDownloadUrl() .

Descargar en memoria

Descargue el archivo a UInt8List con el método getData() . Esta es la forma más sencilla de descargar un archivo, pero debe cargar todo el contenido del archivo en la memoria. Si solicita un archivo más grande que la memoria disponible de su aplicación, su aplicación fallará. Para protegerse contra problemas de memoria, getData() necesita una cantidad máxima de bytes para descargar. Establece el tamaño máximo en algo que sepas que tu aplicación puede manejar o utiliza otro método de descarga.

final islandRef = storageRef.child("images/island.jpg");

try {
  const oneMegabyte = 1024 * 1024;
  final Uint8List? data = await islandRef.getData(oneMegabyte);
  // Data for "images/island.jpg" is returned, use this as needed.
} on FirebaseException catch (e) {
  // Handle any errors.
}

Descargar a un archivo local

El método writeToFile() descarga un archivo directamente a un dispositivo local. Úselo si sus usuarios desean tener acceso al archivo sin conexión o compartir el archivo en una aplicación diferente. writeToFile() devuelve un DownloadTask que puede usar para administrar su descarga y monitorear el estado de la descarga.

final islandRef = storageRef.child("images/island.jpg");

final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/images/island.jpg";
final file = File(filePath);

final downloadTask = islandRef.writeToFile(file);
downloadTask.snapshotEvents.listen((taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      // TODO: Handle this case.
      break;
    case TaskState.paused:
      // TODO: Handle this case.
      break;
    case TaskState.success:
      // TODO: Handle this case.
      break;
    case TaskState.canceled:
      // TODO: Handle this case.
      break;
    case TaskState.error:
      // TODO: Handle this case.
      break;
  }
});

Descargar datos a través de URL

Si ya tiene una infraestructura de descarga basada en URL, o simplemente desea compartir una URL, puede obtener la URL de descarga de un archivo llamando al método getDownloadURL() en una referencia de Cloud Storage.

final imageUrl =
    await storageRef.child("users/me/profile.png").getDownloadURL();

Manejar errores

Hay varias razones por las que pueden ocurrir errores durante la descarga, incluido el archivo que no existe o que el usuario no tiene permiso para acceder al archivo deseado. Puede encontrar más información sobre errores en la sección Manejar errores de los documentos.

Ejemplo completo

A continuación se muestra un ejemplo completo de una descarga con manejo de errores:

final islandRef = storageRef.child("images/island.jpg");

final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/images/island.jpg";
final file = File(filePath);

final downloadTask = islandRef.writeToFile(file);
downloadTask.snapshotEvents.listen((taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      // TODO: Handle this case.
      break;
    case TaskState.paused:
      // TODO: Handle this case.
      break;
    case TaskState.success:
      // TODO: Handle this case.
      break;
    case TaskState.canceled:
      // TODO: Handle this case.
      break;
    case TaskState.error:
      // TODO: Handle this case.
      break;
  }
});

También puede obtener y actualizar metadatos de archivos almacenados en Cloud Storage.