Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Permanent URL of ActiveStorage objects in S3

I have a model called Campaign and every Campaign has one attachment.

I use S3 ActiveStorage storage and I need a PERMANENT URL for my Campaign images.

I currently generate URLs like:

campaign.image.service_url

But this link expires in 5 minutes. I need non-expire links. (Config settings only let me get a URL that expires in 1 week, it does not solve my problem again)

How can I get URLs of my images?

EDIT

Solution:

I use CloudFront as CDN. This is the solution I found:

https://domainName+/campaign.image.key

this gives a link to an image file that does not expire.

like image 944
Muhammed Tüfekyapan Avatar asked Oct 25 '25 14:10

Muhammed Tüfekyapan


1 Answers

Check the docs https://api.rubyonrails.org/classes/ActiveStorage/Variant.html#method-i-service_url

You are not supposed to expose service_url directly:

Returns the URL of the variant on the service. This URL is intended to be short-lived for security and not used directly with users. Instead, the service_url should only be exposed as a redirect from a stable, possibly authenticated URL. Hiding the service_url behind a redirect also gives you the power to change services without updating all URLs. And it allows permanent URLs that redirect to the service_url to be cached in the view.

Use url_for(variant) (or the implied form, like +link_to variant+ or +redirect_to variant+) to get the stable URL for a variant that points to the ActiveStorage::RepresentationsController, which in turn will use this service_call method for its redirection.

So use url_for(campaign.image) (or url_for(campaign.image.some_variant)) instead.

like image 131
arieljuod Avatar answered Oct 28 '25 04:10

arieljuod



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!