O Cloud Storage para Firebase permite fazer download de arquivos de forma rápida e fácil de um bucket do Cloud Storage fornecido e gerenciado pelo Firebase.
Crie uma referência
Para fazer download de um arquivo, primeiro crie uma referência do Cloud Storage para o arquivo que você deseja baixar.
Você pode criar uma referência anexando caminhos secundários à raiz do bucket do Cloud Storage ou pode criar uma referência a partir de um URL gs://
ou https://
existente que faz referência a 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");
Baixar arquivos
Depois de ter uma referência, você pode baixar arquivos do Cloud Storage chamando getData()
ou getStream()
. Se preferir baixar o arquivo com outra biblioteca, você pode obter uma URL de download com getDownloadUrl()
.
Baixar na memória
Baixe o arquivo para um UInt8List
com o método getData()
. Esta é a maneira mais fácil de baixar um arquivo, mas deve carregar todo o conteúdo do arquivo na memória. Se você solicitar um arquivo maior que a memória disponível do seu aplicativo, ele irá travar. Para se proteger contra problemas de memória, getData()
leva uma quantidade máxima de bytes para ser baixado. Defina o tamanho máximo para algo que você sabe que seu aplicativo pode suportar 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.
}
Baixar para um arquivo local
O método writeToFile()
baixa um arquivo diretamente para um dispositivo local. Use isto se seus usuários quiserem ter acesso ao arquivo off-line ou compartilhar o arquivo em um aplicativo diferente. writeToFile()
retorna um DownloadTask
que você pode usar para gerenciar seu download 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;
}
});
Baixar dados via URL
Se você já possui uma infraestrutura de download baseada em URLs ou apenas deseja compartilhar um URL, 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();
Lidar com erros
Existem vários motivos pelos quais podem ocorrer erros no download, incluindo o arquivo não existir ou o usuário não ter permissão para acessar o arquivo desejado. Mais informações sobre erros podem ser encontradas na seção Tratar erros da documentação.
Exemplo completo
Um exemplo completo de download com tratamento de erros é 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;
}
});
Você também pode receber e atualizar metadados de arquivos armazenados no Cloud Storage.