我已经使用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获取私有文件..
答案 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
:
你可以通过以下方式调用经过身份验证的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)