Edited at

Active Storage利用時にPublic URLな画像を利用する方法

Active Storageでs3などにファイルをアップロードする場合、基本的にprivateでアップロードされ、画像表示時には一時URLを参照することになります。

ただ、ogpに使う画像などpublicで恒久的なURLが欲しい場合があると思います。

そんなときの対処方法を調べてみたので共有します。


結論

rails_representation_url を使うのが良さそう感

class Member < ApplicationRecord

has_one_attached :avatar
end

みたいなモデルの場合

rails_representation_url(@member.avatar.variant(resize: "512x512!", strip: true).processed, disposition: :inline)

のように取得できます


作業ログ


Active StorageはまだPublic URL(ファイル)に対応していない


まじかよ


Rails の ActiveStorage を S3 で使ったらPublicなURLが取れなかった


アップロード時に権限を変更する方法(アップロード後にLambdaでやっても良さそう)があるのか。

でもなんかもっといいやり方ないんだろうか


Rails ActiveStorage で PUBLIC な URL を表示する


このやり方良さそう。

でもbucketポリシーで指定してるけど、Active Storage側はprivate前提なので、後で見たときわからなくなりそうだったり、Active Storage側のレールに乗ってない感で、ちょっと不安あるなあと思ったので、他の選択肢ってないかな

images_controllerみたいなのを自前で作って、signed_urlにリダイレクトすることで、そのURLが公開URLになるのでは?

そういうのがActive Storage公式にあった

https://github.com/rails/rails/blob/v5.2.3/activestorage/app/controllers/active_storage/representations_controller.rb


Take a signed permanent reference for a blob representation and turn it into an expiring service URL for download.

Note: These URLs are publicly accessible. If you need to enforce access protection beyond the

security-through-obscurity factor of the signed blob and variation reference, you'll need to implement your own

authenticated redirection controller.


↓ グーグル翻訳


BLOB表現の署名付き永久参照を取得し、ダウンロード用に有効期限が切れたサービスURLに変換します。

注:これらのURLは一般にアクセス可能です。 アクセス保護を超えてアクセス保護を強化する必要がある場合

署名されたBLOBとバリエーション参照のセキュリティを通じた曖昧さ要因、あなた自身で実装する必要があるでしょう

認証済みリダイレクトコントローラ。


なんか求めてるもののような違うような...英語力が貧弱なので不安

処理を見てみると 単純に service_url へリダイレクトをしているので求めているものっぽい感じ

expireしても再取得できそう

Rails Guideに載ってないのでちょっと不安だが、これを使うことにしました。