Edited at

PaperclipでS3に画像をアップロードする

More than 3 years have passed since last update.


Paperclip選定の経緯

carrierwaveが良さそうだって検討したが、ドキュメント周りをうまく拾うことが出来なかったので断念した。

refileも良さそうだったんだけど、同じように設定で戸惑ったので断念した。


Paperclipの導入

https://github.com/thoughtbot/paperclip を参考に導入する。

Development環境で https://github.com/thoughtbot/paperclip#image-processor の通りに config/environments/development.rb に設定を書き込むのを忘れないようにしましょう。 動かないケースが有ります。

上記URL通りだと、本番にも影響してしまうので以下のように書いてもいいかもしれません。


config/environments/development.rb

Paperclip.options[:command_path] = "/usr/local/bin/"


Paperclip自体は、S3と連携しなくても動くので、DevelopmentでもS3に関係無く開発出来て便利です。

今回は画像だったので、バリデーションを次のように設定した。

validates_attachment_content_type :content, content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"]


S3連携

Uploading Files to S3 in Ruby with Paperclip を参考に設定を行った。実際にはs3に media.yoneapp.com のようにドメインを当てていたので、このドキュメント通りには事が進まなかった。

最終的には次のような設定を行った。urlが理解しにくかったのだが https://github.com/thoughtbot/paperclip/blob/95acf3b898bd782f4429d42fd2d8812505390328/lib/paperclip/storage/s3.rb#L159 にあるように実際のurlではなくurlの構成方法を決めるパラメータのようです。


config/environments/production.rb

config.paperclip_defaults = {

storage: :s3,
s3_credentials: {
access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'),
s3_region: "ap-northeast-1",
bucket: "media.yoneapp.com",
},
s3_host_alias: "media.yoneapp.com",
path: "/:class/:attachment/:id_partition/:style/:filename",
url: ":s3_alias_url",
s3_protocol: "https"
}

またpathを設定せず:s3_alias_urlを指定するとPaperclip::Errors::InfiniteInterpolationErrorが発生する。