把檔案存在amazon s3上
試出來了真開心,來發篇心得文。
http://github.com/jnicklas/carrierwave/wiki/How-to%3A-Make-Carrierwave-work-on-Heroku
就像這篇說的一樣,heroku上不能放上傳的檔案,所以想要讓使用者上傳檔案的話就得另尋他處,就像amazon s3。
很可惜的是,這篇的方法不適用於最近的carrierwave,害我試了好久。
最新的carrierwave應該用這篇:http://github.com/jnicklas/carrierwave/wiki/How-to%3A-Migrate-to-the-new-Fog-storage-provider
CarrierWave.configure do |config|
config.fog_credentials = {
:provider => 'AWS',
:aws_access_key_id => 'xxx',
:aws_secret_access_key => 'yyy',
:region => 'us-east-1'
}
config.fog_directory = 'name_of_bucket'
config.fog_host = 'http://assets.example.com'
config.fog_public = true
config.fog_attributes = {'Cache-Control' => 'max-age=315576000'}
end
fog_credentials裡前三項是必要的,region設和當初建立bucket時一樣的區域,理論上會比較快(汗)。我是設ap-southeast-1,也就是新加坡。這裡有一份列表,列出所有伺服器的代號:http://docs.amazonwebservices.com/general/latest/gr/rande.html#s3_region
下面的變數只有fog_directory是必要的,其他的我都沒設定也能跑。
可能會遇到的問題有:打錯字。(汗)就像我把bucket名稱設成環境變數,但卻打錯了,光抓這個bug就抓了好久。
還有一個是讀檔時的問題,請看:
def inst
@inst ||= ::QuickMagick::Image.read(image.url).first
end
如果檔案存在本機上,用image.path是沒有問題的。但用了網路空間之後,這裡就得用image.url了。
最後,在deploy到heroku上時,請確定你有設好環境變數。(如果你在設定檔裡有用的話)
講得可能不是很清楚,不過我也是第一次碰aws的東西,還請見諒。
更新
後來發現其實把bucket設在預設的位置就好,參見這篇:
http://devcenter.heroku.com/articles/s3#s3-setup
测试