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.
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");
Baixar arquivos
Depois de ter uma referência, você pode baixar arquivos do Cloud Storage chamando getBytes()
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 byte[]
com o método getBytes()
. 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, getBytes()
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.
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 } });
Baixar para um arquivo local
O método getFile()
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. getFile()
retorna um DownloadTask
que você pode usar para gerenciar seu download 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 ativamente seu download, consulte Gerenciar downloads para obter mais informações.
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.
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 } });
Baixando imagens com FirebaseUI
O FirebaseUI fornece vinculações móveis nativas simples, personalizáveis e prontas para produção para eliminar códigos clichê e promover as práticas recomendadas do Google. Usando o FirebaseUI, você pode baixar, armazenar em cache e exibir imagens do Cloud Storage de maneira rápida e fácil usando nossa integração com o Glide .
Primeiro, adicione FirebaseUI ao seu app/build.gradle
:
dependencies { // FirebaseUI Storage only implementation 'com.firebaseui:firebase-ui-storage:7.2.0' }
Depois, você pode carregar imagens diretamente do Cloud Storage em um 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);
Lidar com mudanças no ciclo de vida da atividade
Os downloads continuam em segundo plano mesmo após alterações no ciclo de vida da atividade (como apresentar uma caixa de diálogo ou girar a tela). Todos os ouvintes que você anexou também permanecerão anexados. Isso poderá causar resultados inesperados se eles forem chamados após a interrupção da atividade.
Você pode resolver esse problema inscrevendo seus ouvintes 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 obter tarefas de download que ainda estão em execução ou concluídas recentemente.
O exemplo abaixo demonstra isso e também mostra como persistir 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! // ... } }); } }
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:
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 } });
Você também pode receber e atualizar metadados de arquivos armazenados no Cloud Storage.