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();
Lidar com 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.