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?
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.
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.
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.
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(); }
//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); } }); } }); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With