Ae2f9b4a14f7d9b08c1e26b02952f0cd

把檔案存在amazon s3上

2012-10-18 15:46:45 +0800RexableRuby on Rails 節點 中發起
最後由 xiaoronglv2012-10-21 10:59:48 +0800回應 , 200次閱讀

試出來了真開心,來發篇心得文。
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

截至 2012-10-21 10:59:48 +0800,共收到 1 條回應
28936031e91c554c5255d939bd80350a
xiaoronglv 1樓, 於2012-10-21 10:59:48 +0800回應

测试

需要 登入 後方可回應,如果你還沒有帳號按這裡 註冊