亚马逊s3虚拟主机桶

时间:2010-12-06 12:16:46

标签: ruby-on-rails amazon-s3 paperclip

我已经使用paperclip在s3上传了一个文件..文件上传过程正常工作.. 现在我想下载它。在我的模型中,我设置了我的:s3_host_alias ..现在因为文件是私有的..所以如果我试图使用paperclip url方法获取文件...它给我访问被拒绝错误...

如果我使用S3Object.url_for方法,则网址返回为s3.amazonaws.com/mybucket/path_of_file

我不希望s3.amazonaws.com显示在我的模型中使用:s3_host_alias的网址中 并在我的DNS服务器中创建了一个CNAME ...现在,如果我直接使用@object.url,那么它会提供正确的URL但会抛出访问被拒绝错误。因为我猜不会传递access_key和签名..

有没有办法通过使用规范网址使用回形针从s3获取私有文件..

2 个答案:

答案 0 :(得分:0)

我不使用paperclip,但是,您可以使用虚拟主机名签署S3请求。

答案 1 :(得分:0)

我使用Paperclip和AWS :: S3 gem遇到了这个问题。 Paperclip为未经过身份验证的请求设置了一切正常。但是回退到AWS :: S3以生成经过身份验证的URL并未使用S3主机别名。

您可以在连接上传递AWS :: S3服务器选项,但我不需要或只想获取URL以获取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(Configuration是一个用于存储,natch,配置值的自定义类):

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)