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)
のように取得できます
作業ログ
まじかよ
↓
アップロード時に権限を変更する方法(アップロード後にLambdaでやっても良さそう)があるのか。
でもなんかもっといいやり方ないんだろうか
↓
このやり方良さそう。
でもbucketポリシーで指定してるけど、Active Storage側はprivate前提なので、後で見たときわからなくなりそうだったり、Active Storage側のレールに乗ってない感で、ちょっと不安あるなあと思ったので、他の選択肢ってないかな
↓
images_controllerみたいなのを自前で作って、signed_urlにリダイレクトすることで、そのURLが公開URLになるのでは?
↓
そういうのがActive Storage公式にあった
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に載ってないのでちょっと不安だが、これを使うことにしました。