Fazer o download de arquivos com o Cloud Storage no Flutter

Com o Cloud Storage para Firebase, é possível fazer o download de maneira rápida e fácil de arquivos de um bucket do Cloud Storage fornecido e gerenciado pelo Firebase.

Criar uma referência

Para fazer o download de um arquivo, primeiro crie uma referência do Cloud Storage para o arquivo que você quer transferir.

Crie uma referência anexando caminhos filhos à raiz do bucket do Cloud Storage ou crie uma referência usando um URL gs:// ou https:// ao referenciar um objeto no 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");

Fazer download de arquivos

Depois de criar a referência, é possível fazer o download de arquivos do Cloud Storage chamando getData() ou getStream(). Se preferir fazer o download do arquivo com outra biblioteca, use getDownloadUrl() para receber um URL para download.

Fazer download na memória

Faça o download do arquivo para um UInt8List com o método getData(). Essa é a maneira mais fácil de fazer o download de um arquivo, mas é preciso carregar todo o conteúdo do arquivo na memória. Se você solicitar um arquivo maior que a memória disponível do seu app, o app apresentará falha. Para se proteger contra erros de memória, getData() aceita uma quantidade máxima de bytes para downloads. Defina o tamanho máximo como um valor que o app possa comportar ou use outro método de download.

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

Fazer o download para um arquivo local

O método writeToFile() faz o download de um arquivo diretamente para um dispositivo local. Use esse método se os usuários quiserem ter acesso ao arquivo off-line ou compartilhá-lo em outro app. writeToFile() retorna uma DownloadTask que pode ser usada para gerenciar e monitorar o status do download.

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;
  }
});

Download de dados via URL

Se você já tiver uma infraestrutura de download com base em URLs ou apenas quiser um URL para compartilhar, você poderá obter o URL de download de um arquivo chamando o método getDownloadURL() em uma referência do Cloud Storage.

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

Tratar erros

Durante os downloads, é possível que erros ocorram por vários motivos. Por exemplo, o arquivo não existe ou o usuário não tem permissão para acessá-lo. Saiba mais sobre erros na seção Solucionar erros.

Exemplo completo

Um exemplo completo de um erro no download é mostrado abaixo:

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;
  }
});

Também é possível receber e atualizar metadados de arquivos armazenados no Cloud Storage.