您需要在从 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)