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でのAmazonドメインの非表示は、通常DNSエイリアスを使用して行われます。サブドメインをエイリアスするCNAMEレコードを作成する必要があります。次に、でオプションを指定できます。S3gemはそれを使用してリンクを生成します。downloads.mydomain
s3.amazonaws.com
:server
AWS::S3::Base.establish_connection!(:server => "downloads.mydomain", ...)