Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get URL from Firebase Storage getDownloadURL

I'm trying to get the "long term persistent download link" to files in our Firebase storage bucket. I've changed the permissions of this to

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

And my javacode looks like this:

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

When I run this I get the uri link that looks something like com.google.android.gms.tasks.zzh@xxx

Question 1. Can I from this get the download link similar to: https://firebasestorage.googleapis.com/v0/b/project-xxxx.appspot.com/o/20-5-2016.csv?alt=media&token=b5d45a7f-3ab7-4f9b-b661-3a2187adxxxx

When trying to get the link above I changed the last row before my return, like this:

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

But when doing this i get a 403 error, and the app crashing. The consol tells me this is bc user is not logged in /auth. "Please sign in before asking for token"

Question 2. How do I fix this?

like image 921
Jonathan Fager Avatar asked May 22 '16 13:05

Jonathan Fager


People also ask

How do I get Firebase storage URL?

Image URL is obtained by uploading an image to firebase bucket and then that can return back a URL that URL is a permanent URL which can be open anywhere. Then a user can use this URL for any purpose in its application.

How do I get files from Firebase storage?

There are two ways to download files with Firebase Storage, using references in the SDK or a download URL. iOS and Android users can download files into memory, disk, or from a download URL. The web SDK can download files just from a download URL. StorageReference storageRef = FirebaseStorage.

How do I get metadata from Firebase storage?

Get File Metadata File metadata contains common properties such as name , size , and contentType (often referred to as MIME type) in addition to some less common ones like contentDisposition and timeCreated . This metadata can be retrieved from a Cloud Storage reference using the getMetadata() method.


2 Answers

Please refer to the documentation for getting a download URL.

When you call getDownloadUrl(), the call is asynchronous and you must subscribe on a success callback to obtain the results:

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

This will return a public unguessable download url. If you just uploaded a file, this public url will be in the success callback of the upload (you do not need to call another async method after you've uploaded).

However, if all you want is a String representation of the reference, you can just call .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(); } 
like image 69
Benjamin Wulfe Avatar answered Sep 20 '22 14:09

Benjamin Wulfe


//Firebase Storage - Easy to Working with uploads and downloads.

@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);                         }                     });                 }             }); } 
like image 27
Subhojit Halder Avatar answered Sep 20 '22 14:09

Subhojit Halder