2010-12-06 97 views
0

我上傳了一個使用回形針的s3上的文件..文件上傳過程很好.. 現在我想下載它。在我的模型中我已經設置我的:s3_host_alias ..現在作爲文件是私人..所以,如果我試圖使用回形針網址方法獲取文件...它給我訪問被拒絕的錯誤...亞馬遜s3虛擬主機的存儲桶

如果我我使用S3Object.url_for方法然後url返回是s3.amazonaws.com/mybucket/path_of_file

我不想THT s3.amazonaws.com在在我的模型 所以使用:s3_host_alias的URL顯示和創建CNAME inmy DNS服務器......現在,如果我直接使用@object.url那麼它給予正確網址,但拋出訪問被拒絕的錯誤。因爲我想access_key和簽名不過去了..

有沒有我不使用回形針的方式來從S3使用回形針使用規範的網址私人文件..

回答

0

,但是,是的,你可以使用虛擬主機名簽署S3請求。

0

我有使用Paperclip和AWS :: S3 gem的問題。回形針設置一切正確的未經身份驗證的請求。但是回退到AWS :: S3以生成經過身份驗證的URL不會使用S3主機別名。

您可以在連接上傳遞AWS :: S3服務器選項,但我不需要或僅需要連接來獲取URL。我也看不到通過配置來設置它的方式(所以它將應用於連接之外)。即使看到源代碼,它看起來也是不可配置的。

所以,我創建了一個猴子補丁。我的Ruby-fu(也許是我的OO-fu)不是超高的,所以可能有更好的方法來做到這一點,但它適用於我所需要的。基本上,我通過url_for :s3_host_alias param選項散列,然後猴子補丁使用它,如果它通過。如果通過,它還必須從生成的路徑中移除存儲桶。

所以....

您可以創建這個1行的文件,RAILS_ROOT/initializers/load_patches.rb,加載所有補丁RAILS_ROOT/lib

Dir[File.join(Rails.root, 'lib', 'patches', '**', '*.rb')].sort.each { |patch| require(patch) } 

然後用這個代碼創建文件RAILS_ROOT/lib/patches/aws.rb

http://pastie.org/1622881

而且你可以調用一個沿着這些的東西來驗證URL (配置是用於存儲,標記,配置值的自定義類):

AWS::S3::S3Object.url_for(media.path(style || media.default_style), media.bucket_name, :expires_in => expires_in, :use_ssl => false, :s3_host_alias => Configuration.s3_host_alias)