Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Firebase Storage: Using Download Url Instead of Storage Ref

I have an iOS app that uses Firebase Storage for storing images. After an image is uploaded I save its storage reference in my Firebase Database. When the app loads, it fetches various storage references from the database and uses the FirebaseUI method to display their corresponding images like so:

let storageRef = Storage.storage().reference(forURL: imageUrl)
imageView.sd_setImage(with: storageRef, placeholderImage: nil)

This works great... but its very slow.

While looking for solutions to speeding up Firebase Storage I found this post that hints at using an image's public link, ie. its download url, instead of its storage reference: https://stackoverflow.com/a/44362350/5225013

My understanding is that this has something to do with the public urls having a CDN in front of them, whereas the storage references don't.

The download url can be retrieved in the app with the following code:

let storageRef = Storage.storage().reference(forURL: imageUrl)
storageRef.downloadURL { (downloadUrl, error) in

    if let downloadUrl = downloadUrl {
        // do something with downloadUrl
    }
}

Getting it this way is pretty useless for my purpose, though, because making the asynchronous call tacks on extra time before the image can be displayed...

I've been toying with the idea of writing a cloud function to save each image's download url alongside its corresponding storage reference in the database, and then using that for displaying the images in the app. The images aren't personal, nor do they contain sensitive content, so I don't mind if they're public. I'm mainly wondering; is there anything I should be worried about if I do this? Is it uncommon practise for a reason?

like image 844
Grambo Avatar asked Jan 25 '23 17:01

Grambo


1 Answers

You don't need to "do" anything.

For public files in storage (i.e. files with the allow read; security rule), the URL to get them is:

https://firebasestorage.googleapis.com/v0/b/(project id).appspot.com/o/(storage path)?alt=media

What I do in my apps is store the storage path and then construct the public download URL using simple concatenation.

Works like a charm.

Note that certain characters in the storage path (like spaces and slashes) must be escaped. In JavaScript you can do it with encodeURIComponent().

Also note that enforcing App Check for Storage breaks this.

like image 94
Stratubas Avatar answered Feb 13 '23 18:02

Stratubas