0

Amazon S3 にファイルを保存するアプリを作成しています。URLを使用してファイルを保存および取得できます。ただし、これらのリンクは公開されているため、アセットコントローラーで次のメソッドを使用して、S3 から保存されたファイルを取得しようとしています。

リンクとして、これらのファイルはブラウザで表示/アクセスできますが、このコードを使用すると:

#This action will let the users download the files (after a simple authorization check)
def get
  asset = current_user.assets.find_by_id(params[:id])
  if asset
  #Parse the URL for special characters first before downloading  
  data = open("#{URI.parse(URI.encode(asset.uploaded_file.url))}")
  #then again, use the "send_data" method to send the above binary "data" as file.  
   send_data data, :filename => asset.uploaded_file_file_name 

 else
   flash[:error]="Access Violation"
   redirect_to assets_path
 end

終わり

ブラウザで次のエラーが表示されます。

Errno::ENOENT in AssetsController#get
No such file or directory - http://s3.amazonaws.com/BUCKETNAME/assets/29/FILENAME.jpeg?    1339979591

S3 管理コンソールにログインしているときに S3 サイトのリソースをクリックすると、ブラウザにファイルが表示され、そのリンクが

https://s3.amazonaws.com/BUCKETNAME/assets/29/FILENAME.jpeg?     AWSAccessKeyId=XXXXXXXXXXXExpires=1340003832&Signature=XXXXXXXXXXXXXXXXXX-amz-security-      token=XXXXXXXXX//////////XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

存在しますが、アプリからアクセスできません

ブラウザからのアプリケーション トレースは次のとおりです。

app/controllers/assets_controller.rb:99:in `initialize'
app/controllers/assets_controller.rb:99:in `open'
app/controllers/assets_controller.rb:99:in `get'

何が起こっているのか手がかりはありますか?

ありがとう

4

1 に答える 1

0

ユーザーをS3のファイルにリダイレクトすることもできます。

ちょうど試して

redirect_to asset.uploaded_file.url

の代わりにsend_filesend_fileローカルファイルへのパスが必要です。ローカルファイルは、Webサーバーによって使用されます。

を設定s3_permissions => :privateした場合は、電話する必要があります

redirect_to asset.uploaded_file.expiring_url(10)

エラーメッセージで、s3のhttpsに対してhttpであるということも興味深いです。モデルのhas_attached_fileに次のオプションを追加することもできます。

:s3_protocol => 'https' 

お役に立てれば。

于 2012-07-02T15:35:28.133 に答える