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.
Kotlin+KTX
// Create a storage reference from our app val storageRef = storage.reference // Create a reference with an initial file path and name val pathReference = storageRef.child("images/stars.jpg") // Create a reference to a file from a Google Cloud Storage URI val gsReference = storage.getReferenceFromUrl("gs://bucket/images/stars.jpg") // Create a reference from an HTTPS URL // Note that in the URL, characters are URL escaped! val httpsReference = storage.getReferenceFromUrl( "https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg", )
Java
// Create a storage reference from our app StorageReference storageRef = storage.getReference(); // Create a reference with an initial file path and name StorageReference pathReference = storageRef.child("images/stars.jpg"); // Create a reference to a file from a Google Cloud Storage URI StorageReference gsReference = storage.getReferenceFromUrl("gs://bucket/images/stars.jpg"); // Create a reference from an HTTPS URL // Note that in the URL, characters are URL escaped! StorageReference httpsReference = storage.getReferenceFromUrl("https://firebasestorage.googleapis.com/b/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 getBytes()
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 byte[]
com o método getBytes()
. 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, getBytes()
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.
Kotlin+KTX
var islandRef = storageRef.child("images/island.jpg") val ONE_MEGABYTE: Long = 1024 * 1024 islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener { // Data for "images/island.jpg" is returned, use this as needed }.addOnFailureListener { // Handle any errors }
Java
StorageReference islandRef = storageRef.child("images/island.jpg"); final long ONE_MEGABYTE = 1024 * 1024; islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() { @Override public void onSuccess(byte[] bytes) { // Data for "images/island.jpg" is returns, use this as needed } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { // Handle any errors } });
Fazer o download para um arquivo local
O método getFile()
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. getFile()
retorna uma DownloadTask
que pode ser usada para gerenciar
e monitorar o status do download.
Kotlin+KTX
islandRef = storageRef.child("images/island.jpg") val localFile = File.createTempFile("images", "jpg") islandRef.getFile(localFile).addOnSuccessListener { // Local temp file has been created }.addOnFailureListener { // Handle any errors }
Java
islandRef = storageRef.child("images/island.jpg"); File localFile = File.createTempFile("images", "jpg"); islandRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() { @Override public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) { // Local temp file has been created } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { // Handle any errors } });
Se você quiser gerenciar o download ativamente, consulte este link para mais informações.
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á receber o URL de download de um arquivo chamando o método
getDownloadUrl()
em uma referência do Cloud Storage.
Kotlin+KTX
storageRef.child("users/me/profile.png").downloadUrl.addOnSuccessListener { // Got the download URL for 'users/me/profile.png' }.addOnFailureListener { // Handle any errors }
Java
storageRef.child("users/me/profile.png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { @Override public void onSuccess(Uri uri) { // Got the download URL for 'users/me/profile.png' } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { // Handle any errors } });
Como fazer o download de imagens com a FirebaseUI
A FirebaseUI fornece vínculos nativos com dispositivos móveis que são simples, personalizáveis e prontos para produção, eliminando assim o código boilerplate e promovendo as práticas recomendadas do Google. Com a FirebaseUI, é possível fazer o download, armazenar em cache e exibir imagens de maneira rápida e fácil no Cloud Storage usando nossa integração com o Glide.
Primeiro, adicione a FirebaseUI ao seu app/build.gradle
:
dependencies { // FirebaseUI Storage only implementation 'com.firebaseui:firebase-ui-storage:7.2.0' }
Em seguida, é possível carregar imagens diretamente do Cloud Storage para uma ImageView
:
Kotlin+KTX
// Reference to an image file in Cloud Storage val storageReference = Firebase.storage.reference // ImageView in your Activity val imageView = findViewById<ImageView>(R.id.imageView) // Download directly from StorageReference using Glide // (See MyAppGlideModule for Loader registration) Glide.with(context) .load(storageReference) .into(imageView)
Java
// Reference to an image file in Cloud Storage StorageReference storageReference = FirebaseStorage.getInstance().getReference(); // ImageView in your Activity ImageView imageView = findViewById(R.id.imageView); // Download directly from StorageReference using Glide // (See MyAppGlideModule for Loader registration) Glide.with(context) .load(storageReference) .into(imageView);
Processar mudanças no ciclo de vida de atividades
Os downloads continuam em segundo plano mesmo após mudanças no ciclo de vida de atividades (como apresentar uma caixa de diálogo ou girar a tela). Qualquer listener conectado permanecerá conectado. Isso poderá causar resultados inesperados se eles forem chamados após a interrupção da atividade.
Esse problema pode ser solucionado ao inscrever seus listeners em um escopo de atividade
para cancelar o registro automaticamente quando a atividade for interrompida. Em seguida, use o
método getActiveDownloadTasks
quando a atividade for reiniciada para receber as tarefas de download
que ainda estiverem em andamento ou que tiverem sido concluídas recentemente.
O exemplo abaixo demonstra isso e também mostra como manter o caminho de referência de armazenamento utilizado.
Kotlin+KTX
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // If there's a download in progress, save the reference so you can query it later outState.putString("reference", storageRef.toString()) } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) // If there was a download in progress, get its reference and create a new StorageReference val stringRef = savedInstanceState.getString("reference") ?: return storageRef = Firebase.storage.getReferenceFromUrl(stringRef) // Find all DownloadTasks under this StorageReference (in this example, there should be one) val tasks = storageRef.activeDownloadTasks if (tasks.size > 0) { // Get the task monitoring the download val task = tasks[0] // Add new listeners to the task using an Activity scope task.addOnSuccessListener(this) { // Success! // ... } } }
Java
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // If there's a download in progress, save the reference so you can query it later if (mStorageRef != null) { outState.putString("reference", mStorageRef.toString()); } } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // If there was a download in progress, get its reference and create a new StorageReference final String stringRef = savedInstanceState.getString("reference"); if (stringRef == null) { return; } mStorageRef = FirebaseStorage.getInstance().getReferenceFromUrl(stringRef); // Find all DownloadTasks under this StorageReference (in this example, there should be one) List<FileDownloadTask> tasks = mStorageRef.getActiveDownloadTasks(); if (tasks.size() > 0) { // Get the task monitoring the download FileDownloadTask task = tasks.get(0); // Add new listeners to the task using an Activity scope task.addOnSuccessListener(this, new OnSuccessListener<FileDownloadTask.TaskSnapshot>() { @Override public void onSuccess(FileDownloadTask.TaskSnapshot state) { // Success! // ... } }); } }
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 Tratar erros.
Exemplo completo
Veja abaixo o exemplo completo de um download com erro e a devida solução:
Kotlin+KTX
storageRef.child("users/me/profile.png").getBytes(Long.MAX_VALUE).addOnSuccessListener { // Use the bytes to display the image }.addOnFailureListener { // Handle any errors }
Java
storageRef.child("users/me/profile.png").getBytes(Long.MAX_VALUE).addOnSuccessListener(new OnSuccessListener<byte[]>() { @Override public void onSuccess(byte[] bytes) { // Use the bytes to display the image } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { // Handle any errors } });
Também é possível receber e atualizar metadados de arquivos armazenados no Cloud Storage.