2

ファイル ストレージを Rackspace Cloudfiles に移動したところ、send_file アクションが壊れました。

def full_res_download
  @asset = Asset.find(params[:id])
  @file = "#{Rails.root}/public#{@asset.full_res}"
  send_file @file
end

新着

def full_res_download
  @asset = Asset.find(params[:id])
  @file = "http://86e.r54.cf1.rackcdn.com/uploads/fake/filepath.mov"
  send_file @file
end

ファイルが公開ファイルにあったとき。コードはうまくいきました。リンクをクリックすると、ファイルがダウンロードされ、Web ページは変更されません。今、このエラーが発生します。

Cannot read file http://86e.r54.cf1.rackcdn.com/uploads/fake/filepath.mov

私は何が欠けていますか?

お時間をいただきありがとうございました。

4

2 に答える 2

3

何がうまくいったか

def full_res_download
  @asset = Asset.find(params[:id])
  @file = open("http://86e.r54.cf1.rackcdn.com/uploads/fake/filepath.mov")
  send_file( @file, :filename => File.basename(@asset.file.path.to_s))
end

実際のコード

controler.rb

def web_video_download
  @asset = Asset.find(params[:id])
  @file = open(CDNURL + @asset.video_file.path.to_s)
  send_file( @file, :filename => File.basename(@asset.video_file.path.to_s))
end

development.rb

CDNURL = "http://86e.r54.cf1.rackcdn.com/"
于 2013-01-02T22:21:57.253 に答える
2

send_fileローカル ファイルを開き、ラック ミドルウェアを使用して送信します。もうファイルをホストしていないので、URL にリダイレクトする必要があります。

コメントの 1 つが指摘しているように、状況によっては、さまざまな理由でリダイレクトを使用できない場合があります。この場合、ファイルをダウンロードし、取得後にユーザーに中継する必要があります。これにより、ユーザーへの転送で次のことが行われます。

  1. リクエストがサーバーに届き、アクションでの処理が開始されます。
  2. アクションは CDN からファイルを要求し、ファイルが完全に取得されるまで待機します。
  3. サーバーはファイルをエンドユーザーに中継できるようになりました。

これは、リダイレクトの場合と比較して次のようになります。

  1. リクエストがサーバーに届き、アクションでの処理が開始されます。
  2. あなたのアクションは、ユーザーを CDN にリダイレクトします。

どちらの場合も、ユーザーは 2 回の完全な接続を待つ必要がありますが、サーバーはいくつかの作業を節約しました。結果として、状況が許せばリダイレクトを使用する方が効率的です。

于 2012-12-30T04:50:48.287 に答える