您可以将 s3 对象创建为私有对象,并使用url_for方法 (aws-s3 gem) 为它们生成临时公共 url。这样,您就不会通过更具可扩展性的应用服务器流式传输文件。它还允许放置基于会话的授权(例如在您的应用中设计)、跟踪下载事件等。
为此,请将指向 s3 托管文件的直接链接更改为指向控制器/操作的链接,从而创建临时 url 并重定向到它。像这样:
class HostedFilesController < ApplicationController
def show
s3_name = params[:id] # sanitize name here, restrict access to only some paths, etc
AWS::S3::Base.establish_connection!( ... )
url = AWS::S3::S3Object.url_for(s3_name, YOUR_BUCKET, :expires_in => 2.minutes)
redirect_to url
end
end
在下载 url 中隐藏亚马逊域通常是通过 DNS 别名来完成的。您需要创建别名为您的子域的 CNAME 记录downloads.mydomain
,例如s3.amazonaws.com
. 然后您可以在其中指定:server
选项AWS::S3::Base.establish_connection!(:server => "downloads.mydomain", ...)
,S3 gem 将使用它来生成链接。