Cómo obtener una URL desde Firebase Storage getDownloadURL

Resuelto Jonathan Fager asked hace 54 años • 15 respuestas

Estoy intentando obtener el "enlace de descarga persistente a largo plazo" para los archivos en nuestro depósito de almacenamiento de Firebase. He cambiado los permisos de esto a

service firebase.storage {
  match /b/project-xxx.appspot.com/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

Y mi código java se ve así:

private String niceLink (String date){
    String link;
    // Points to the root reference
    StorageReference storageRef = FirebaseStorage.getInstance().getReference();
    StorageReference dateRef = storageRef.child("/" + date+ ".csv");
    link = dateRef.getDownloadUrl().toString();
    return link;
}

Cuando ejecuto esto, aparece el enlace URI que se parece a com.google.android.gms.tasks.zzh@xxx

Pregunta 1. ¿Puedo obtener desde aquí un enlace de descarga similar a: https://firebasestorage.googleapis.com/v0/b/project-xxxx.appspot.com/o/20-5-2016.csv?alt=media&token= b5d45a7f-3ab7-4f9b-b661-3a2187adxxxx

Al intentar obtener el enlace de arriba, cambié la última fila antes de mi regreso, así:

private String niceLink (String date){
    String link;
    // Points to the root reference
    StorageReference storageRef = FirebaseStorage.getInstance().getReference();
    StorageReference dateRef = storageRef.child("/" + date+ ".csv");
    link = dateRef.getDownloadUrl().getResult().toString();
    return link;
}

Pero al hacer esto aparece un error 403 y la aplicación falla. La consola me dice que esto se debe a que el usuario no ha iniciado sesión/auth. "Inicie sesión antes de solicitar el token"

Pregunta 2. ¿Cómo soluciono esto?

Jonathan Fager avatar Jan 01 '70 08:01 Jonathan Fager
Aceptado

Consulte la documentación para obtener una URL de descarga .

Cuando llamas getDownloadUrl(), la llamada es asincrónica y debes suscribirte a una devolución de llamada exitosa para obtener los resultados:

// Calls the server to securely obtain an unguessable download Url
private void getUrlAsync (String date){
    // Points to the root reference
    StorageReference storageRef = FirebaseStorage.getInstance().getReference();
    StorageReference dateRef = storageRef.child("/" + date+ ".csv");
    dateRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>()
    {
        @Override
        public void onSuccess(Uri downloadUrl) 
        {                
           //do something with downloadurl
        } 
    });
}

Esto devolverá una URL de descarga pública imposible de adivinar. Si acaba de cargar un archivo, esta URL pública estará en la devolución de llamada exitosa de la carga (no necesita llamar a otro método asíncrono después de haber cargado).

Sin embargo, si todo lo que desea es una Stringrepresentación de la referencia, puede simplemente llamar.toString()

// Returns a Uri of the form gs://bucket/path that can be used
// in future calls to getReferenceFromUrl to perform additional
// actions
private String niceRefLink (String date){
    // Points to the root reference
    StorageReference storageRef = FirebaseStorage.getInstance().getReference();
    StorageReference dateRef = storageRef.child("/" + date+ ".csv");
    return dateRef.toString();
}
Benjamin Wulfe avatar May 22 '2016 20:05 Benjamin Wulfe

//Firebase Storage: fácil de trabajar con cargas y descargas.

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == RC_SIGN_IN){
        if(resultCode == RESULT_OK){
            Toast.makeText(this,"Signed in!", LENGTH_SHORT).show();
        } else if(resultCode == RESULT_CANCELED){
            Toast.makeText(this,"Signed in canceled!", LENGTH_SHORT).show();
            finish();
        }
    } else if(requestCode == RC_PHOTO_PICKER && resultCode == RESULT_OK){

        // HERE I CALLED THAT METHOD
        uploadPhotoInFirebase(data);

    }
}

private void uploadPhotoInFirebase(@Nullable Intent data) {
    Uri selectedImageUri = data.getData();

    // Get a reference to store file at chat_photos/<FILENAME>
    final StorageReference photoRef = mChatPhotoStorageReference
                    .child(selectedImageUri
                    .getLastPathSegment());

    // Upload file to Firebase Storage
    photoRef.putFile(selectedImageUri)
            .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                    // Download file From Firebase Storage
                    photoRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri downloadPhotoUrl) {
                            //Now play with downloadPhotoUrl
                            //Store data into Firebase Realtime Database
                            FriendlyMessage friendlyMessage = new FriendlyMessage
                                    (null, mUsername, downloadPhotoUrl.toString());
                            mDatabaseReference.push().setValue(friendlyMessage);
                        }
                    });
                }
            });
}
Subhojit Halder avatar Nov 08 '2018 00:11 Subhojit Halder

aquí estoy subiendo y obteniendo la URL de la imagen al mismo tiempo...

           final StorageReference profileImageRef = FirebaseStorage.getInstance().getReference("profilepics/" + System.currentTimeMillis() + ".jpg");

            if (uriProfileImage != null) {

            profileImageRef.putFile(uriProfileImage)
                        .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                               // profileImageUrl taskSnapshot.getDownloadUrl().toString(); //this is depreciated

                          //this is the new way to do it
                   profileImageRef.getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
                                    @Override
                                    public void onComplete(@NonNull Task<Uri> task) {
                                       String profileImageUrl=task.getResult().toString();
                                        Log.i("URL",profileImageUrl);
                                    }
                                });
                            }
                        })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                progressBar.setVisibility(View.GONE);
                                Toast.makeText(ProfileActivity.this, "aaa "+e.getMessage(), Toast.LENGTH_SHORT).show();
                            }
                        });
            }
Shrawan Thakur avatar Feb 14 '2019 18:02 Shrawan Thakur

En mi caso, hice mi código en Kotlin y tuve el mismo error "getDownload()". Aquí están las dependencias que funcionaron para mí y el código Kotlin.

implementation 'com.google.firebase:firebase-storage:18.1.0'dependencias de almacenamiento de base de fuego

Esto lo agregué y funcionó para mí en Kotlin. Storage() vendría antes de Download()

profileImageUri = taskSnapshot.storage.downloadUrl.toString()
TwistenTiger avatar Jul 25 '2019 12:07 TwistenTiger