0

私はかなり一般的な設定だと思います。

Rails 3アプリはHerokuでホストされており、Paperclipを使用して、ビデオや画像のファイルアップロードを管理し、すべてのファイルをAmazonS3に保存しています。ファイルが添付されるモデルはエントリであり、添付ファイル自体は「メディア」と呼ばれます。だから、私はこのようにペーパークリップを設定しています:

class Entry < ActiveRecord::Base
  has_attached_file :media, {:storage=>:s3,
                             :bucket=>"mybucketname",
                             :s3_credentials=> <credentials hash>}

これはすべて正常に機能しています。しかし、今度はファイルにダウンロードリンクを追加して、ユーザーがたとえば編集用にビデオをダウンロードできるようにします。私はこれを次のように行いました:

ページのダウンロードリンク:

<p><%= link_to "Download", download_entry_path(entry) %></p>

これは、EntriesControllerで次のようなダウンロードアクションを呼び出すだけです。

def download
  @entry = Entry.find(params[:id])
  if @entry.media.file?
    send_file @entry.media.to_file, :type => @entry.media_content_type, 
                                    :disposition => 'attachment', 
                                    :filename => @entry.media_file_name,
                                    :x_sendfile => true
  else
    flash[:notice] = "Sorry, there was a problem downloading this file"
    redirect_to report_path(@entry.report) and return      
  end  
end

一部のダウンロードは非常に大きくなるため、dynoに縛られないように、ダウンロードをサーバーにハイブオフしたいと思います。そのため、x_sendfileオプションを使用しています。ただし、正しく設定されているとは思いません。herokuログで次のように表示されます。

2011-06-30T11:57:33+00:00 app[web.1]: X-Accel-Mapping header missing
2011-06-30T11:57:33+00:00 app[web.1]: 
2011-06-30T11:57:33+00:00 app[web.1]: Started GET "/entries/7/download" for 77.89.149.137 at 2011-06-30 04:57:33 -0700
2011-06-30T11:57:33+00:00 app[web.1]: ### params = {"action"=>"download", "controller"=>"entries", "id"=>"7"}
2011-06-30T11:57:33+00:00 heroku[router]: GET <my-app>/entries/7/download dyno=web.1 queue=0 wait=0ms service=438ms status=200 bytes=94741

「X-Accel-Mappingヘッダーがありません」というメッセージは、何かが正しくないことを示していますが、何がわかりません。基本的に、herokuのnginxサーバーがファイルのダウンロードを自動的に行うかどうか、そうでない場合はどのように行うかはわかりません。また、herokuのドキュメントには何も見つかりません(間違ったものを探している可能性があります)。

誰かが私をまっすぐに設定できますか?アドバイスに感謝します-max

4

1 に答える 1

3

サーバー経由でファイルを送信している理由がわかりません。それらが S3 に保存されている場合、それらに直接リンクしないのはなぜですか?

<%= link_to "Download", entry.media.url %>

そうすれば、ダウンロードは Heroku サーバーを完全にバイパスします。

于 2011-06-30T12:17:22.830 に答える