29

私はHerokuでホストされているRailsアプリケーションを持っています。このアプリは、AmazonS3でPDFファイルを生成して保存します。ユーザーはこれらのファイルをダウンロードして、ブラウザーで表示したり、コンピューターに保存したりできます。

私が抱えている問題は、これらのファイルのダウンロードはS3 URL( "https://s3.amazonaws.com/my-bucket/F4D8CESSDF.pdf"など)を介して可能ですが、明らかに良い方法ではないということです。それ。発生するセキュリティの問題は言うまでもなく、バックエンドに関する多くの情報をユーザーに公開することは望ましくありません。

アプリでコントローラーのS3からファイルデータを取得し、ユーザーのダウンロードストリームを作成して、Amazon URLが公開されないようにすることは可能ですか?

4

3 に答える 3

58

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.mydomains3.amazonaws.com:serverAWS::S3::Base.establish_connection!(:server => "downloads.mydomain", ...)

于 2012-09-05T13:34:23.663 に答える
11

はい、これは可能です。Railsを使用してリモートファイルをフェッチし、サーバーに一時的に保存するか、バッファから直接送信するだけです。これに伴う問題は、もちろん、ユーザーにファイルを提供する前に、最初にファイルをフェッチする必要があるという事実です。議論についてはこのスレッドを参照してください。彼らの解決策は次のようなものです。

#environment.rb
require 'open-uri'

#controller
def index
  data = open(params[:file])
  send_data data, :filename => params[:name], ...
end

この問題も多少関連しています。

于 2012-09-05T12:39:05.780 に答える
-1

まず、ここで説明するように、ドメインにCNAMEを作成する必要があります。

次に、CNAMEに入れたのと同じ名前のバケットを作成する必要があります。

最後に、config / initializers/carrierwave.rbに次の構成を追加する必要があります。

CarrierWave.configure do |config|
    ...  
    config.asset_host         = 'http://bucket_name.your_domain.com'
    config.fog_directory      = 'bucket_name.your_domain.com'
    ...
end
于 2014-04-01T17:54:38.193 に答える