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 [email protected]
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?
Answer
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(); }