LoginSignup
18
16

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-28

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公式にあった

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に載ってないのでちょっと不安だが、これを使うことにしました。

18
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
16