Rails使用Amazon S3來存放圖片和檔案

最近想把Rails開發的程式的圖片檔和檔案移到Amazon S3 上面

發現如果你使用paperclip這個gem的話,方法是很簡單的

首先在Gemfile 加上
ruby Gemfile
gem 'paperclip'
gem 'aws-sdk'

再來先bundle install 安裝一下環境

如果要再上線環境的話就在 config/environments/production.rb 加上

ruby config/environments/production.rb
config.paperclip_defaults = {
:storage => :s3,
:s3_credentials => {
:bucket => ENV['S3_BUCKET_NAME'],
:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
}
}

如果是開發環境就寫在 config/environments/development.rb

再來新增 config/initializers/paperclip.rb 這個檔案
內容為
ruby config/initializers/paperclip.rb
Paperclip::Attachment.default_options[:url] = ':eliving.s3.amazonaws.com'
Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename'
Paperclip::Attachment.default_options[:s3_host_name] = 's3-ap-northeast-1.amazonaws.com'
Paperclip::Attachment.default_options[:s3_host_alias] = 'd1qqbzjjk5tqcm.cloudfront.net

:url的值的設定為 [Bucket Name].s3.amazonaws.com
:path 就是上傳後路徑長的樣子

要注意的地方就是:s3_host_name每個地方的值可能會不一樣
所以可以先上傳一個圖片到s3上面,再取出前面的網址,如圖

螢幕快照 2014-02-20 上午1.03.13.png

再來就是如果要使用cloudfront,就必須在:s3_host_alias設定cloudfront的網址
還有如果設定好:s3_host_alias的值之後,還要做一件事就是,paperclip產生的網址,必須要做轉換,將網址更改指定到cloudfront來讀取,

我的做法是寫一個hepler來幫忙轉換

ruby
module WebsiteHelper
def cloudfront_url( image = nil )
image.to_s.gsub( "s3-ap-northeast-1.amazonaws.com/eliving", 'd1qqbzjjk5tqcm.cloudfront.net' )
end
end

這樣之後,如果不使用cloudfront來存取檔案,就之前使用paperclip自動產生的網址,要使用cloudfront,就將paperclip產生的網址使用這個helper過一下水