2010-12-06 25 views
0

私はs3にpaperclipを使用してファイルをアップロードしました。ファイルアップロードプロセスは正常に動作します。 今、私はそれをダウンロードしたいと思っていました。私のモデルでは私の:s3_host_aliasを設定しました。ファイルがプライベートなので今私はpaperclip URLメソッドを使用してファイルを取得しようとしています...それは私にアクセス拒否エラーを与えています...amazon s3バーチャルホストの仮想ホスト

S3Object.url_forメソッドを使用している場合は、URL戻り値はs3.amazonaws.com/mybucket/path_of_fileです。

私は今、私は直接その正しいを与え、その後@object.urlを使用していた場合... THT s3.amazonaws.comはので、私のモデル で:s3_host_aliasを使用したURLに示されており、CNAME inmyのDNSサーバーを作成する必要はありませんurlがアクセス拒否エラーをスローします。私はACCESS_KEYを推測し、署名が渡されていないので...

は、私はクリップを使用していない正規のURLを使用して、ペーパークリップを使用してS3からプライベートファイルを取得する方法..

答えて

0

はありますが、はい、できます仮想ホスト名を使用してS3要求に署名します。

0

PaperclipとAWS :: S3 gemを使用してこの問題が発生しました。 Paperclipは、認証されていない要求に対してすべての問題を解決します。しかし、認証されたURLを生成するためにAWS :: S3に落ちても、S3ホストエイリアスは使用されませんでした。

接続時にAWS :: S3にサーバーオプションを渡すことはできますが、URLを取得するだけで接続する必要はありません。また、設定を介して設定する方法も見えませんでした(接続外に適用する)。ソースを見ても、設定不可能なようです。

私はサルのパッチを作成しました。私のRuby-fu(と多分私のOO-fu)は超高ではないので、これを行うより良い方法があるかもしれませんが、必要なもののために働きます。基本的には、オプションのハッシュにurl_forの:s3_host_alias paramを渡して、猿パッチがそれを渡すとそれを使用します。渡された場合は、生成されたパスからバケットを削除する必要があります。

Dir[File.join(Rails.root, 'lib', 'patches', '**', '*.rb')].sort.each { |patch| require(patch) } 

はその後、このコードでファイルRAILS_ROOT/lib/patches/aws.rbを作成する:あなたはRAILS_ROOT/libにすべてのパッチをロードするために、この1行のファイル、RAILS_ROOT/initializers/load_patches.rbを作成することができます

ので....

http://pastie.org/1622881

あなたはこれらのlに沿ったもので認証されたURLを呼び出すことができますines(構成は、格納、natch、構成値のカスタムクラスです):

AWS::S3::S3Object.url_for(media.path(style || media.default_style), media.bucket_name, :expires_in => expires_in, :use_ssl => false, :s3_host_alias => Configuration.s3_host_alias) 
関連する問題