2010-12-06 158 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)