在我的应用程序中,我有一个要求让我失望.
我有一个存储在S3中的文件,当用户点击我的应用程序中的链接时,我登录了他们点击链接的数据库,然后将他们的“下载信用额”减去一个,然后我想提示文件下载.
解决方法
在S3桶/对象读取文件时,您需要将文件内容流传输给用户.
如果您使用AWS::S3图书馆这样可能会工作:
send_file_headers!( :length=>S3Object.about(<s3 object>,<s3 bucket>)["content-length"],:filename=><the filename> ) render :status => 200,:text => Proc.new { |response,output| S3Object.stream(<s3 object>,<s3 bucket>) do |chunk| output.write chunk end }
这个代码大多是从send_file代码复制的,它本身只能用于本地文件或类似文件的对象
注:我无论如何建议不要从rails进程本身提供文件.如果可能/可以接受您的用例,我将使用经过身份验证的GET来从桶中提供私有数据.
使用经过身份验证的GET,您可以将存储桶及其对象保留为私有,同时允许临时许可通过制作包含身份验证签名令牌的URL来读取特定对象内容.用户只需重定向到经过身份验证的URL,令牌只能在几分钟内生效.
使用上述AWS :: S3,您可以通过以下方式获取经过身份验证的GET URL:
time_of_exipry = Time.now + 2.minutes S3Object.url_for(<s3 object>,<s3 bucket>,:expires => time_of_exipry)