java android firebase firebase-storage

java - Cómo obtener URL de Firebase Storage getDownloadURL



android firebase-storage (8)

Estoy tratando de obtener el "enlace de descarga persistente a largo plazo" a 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, obtengo el enlace uri que se parece a com.google.android.gms.tasks.zzh@xxx

Pregunta 1. ¿Puedo obtener el 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 me sale un error 403 y la aplicación se bloquea. La consola me dice que este usuario de bc no ha iniciado sesión / auth. "Inicie sesión antes de solicitar el token"

Pregunta 2. ¿Cómo soluciono esto?


// Cargas y descargas sencillas y funcionales de Firebase.

@Anular

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); } }); } }); }


Cuando llama a getDownloadUrl() , la llamada es asíncrona y debe suscribirse en 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 incuestionable. Si acaba de cargar un archivo, esta URL pública estará en la devolución de llamada correcta 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 representación de String de la referencia, puede llamar a .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(); }


El método getDownloadUrl ahora se ha depreciado en la nueva actualización de firebase. En su lugar, use el siguiente método. taskSnapshot.getMetadata (). getReference (). getDownloadUrl (). toString ()


El método getDownloadUrl se eliminó en las versiones de Firebase superiores a 11.0.5. Recomiendo usar la versión 11.0.2 que todavía usa este método.


Para mí, 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 de Kotlin.

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

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

profileImageUri = taskSnapshot.storage.downloadUrl.toString()


Aquí estoy cargando 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(); } }); }


Clean And Simple private void putImageInStorage(StorageReference storageReference, Uri uri, final String key) { storageReference.putFile(uri).addOnCompleteListener(MainActivity.this, new OnCompleteListener<UploadTask.TaskSnapshot>() { @Override public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) { if (task.isSuccessful()) { task.getResult().getMetadata().getReference().getDownloadUrl() .addOnCompleteListener(MainActivity.this, new OnCompleteListener<Uri>() { @Override public void onComplete(@NonNull Task<Uri> task) { if (task.isSuccessful()) { FriendlyMessage friendlyMessage = new FriendlyMessage(null, mUsername, mPhotoUrl, task.getResult().toString()); mFirebaseDatabaseReference.child(MESSAGES_CHILD).child(key) .setValue(friendlyMessage); } } }); } else { Log.w(TAG, "Image upload task was not successful.", task.getException()); } } }); }


StorageReference mStorageRef = FirebaseStorage.getInstance().getReference(); final StorageReference fileupload=mStorageRef.child("Photos").child(fileUri.getLastPathSegment()); UploadTask uploadTask = fileupload.putFile(fileUri); Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() { @Override public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception { if (!task.isSuccessful()) { throw task.getException(); } return ref.getDownloadUrl(); } }).addOnCompleteListener(new OnCompleteListener<Uri>() { @Override public void onComplete(@NonNull Task<Uri> task) { if (task.isSuccessful()) { Uri downloadUri = task.getResult(); Picasso.get().load(downloadUri.toString()).into(image); } else { // Handle failures } } });