2011-06-30 67 views
0

我有我想象的是一個相當常見的設置。下載:回形針,S3,Heroku和x_sendfile

我的rails 3應用程序託管在Heroku上,我使用Paperclip管理所有文件保存在Amazon S3上的文件上傳視頻和圖像。文件附加到的模型是Entry,並且附件本身被稱爲「媒體」。所以,我有回形針這樣設置:

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 

由於一些下載將會非常大,我想將下載下載到服務器以避免捆綁一個測功機。這就是爲什麼我使用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-加速測繪圖頭失蹤」的消息表明,事情是不對的,但我不知道什麼。基本上我不知道是否heroku的nginx服務器會自動下載文件,如果沒有,那麼如何告訴它,並且我在heroku的文檔中找不到任何關於它的文件(我可能在尋找錯誤的東西)。

任何人都可以設置我嗎?感謝任何意見 - 最大

回答

3

我不知道你爲什麼通過服務器發送文件。如果它們存儲在S3上,爲什麼不直接鏈接它們呢?

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

這種方式下載繞過你的Heroku服務器。

+0

嗨弗蘭基。我將它通過控制器的原因是,在某些時候,我需要使s3存儲桶保持私密狀態,以便只能通過應用程序訪問它。然後,人們將無法右鍵點擊(或者按照您的建議點擊鏈接),並直接從其s3網址打開文件。基本上我需要控制誰可以下載文件。 –

+0

@Max,您可以向您的私人存儲分區中的文件請求一個可超時下載URL的S3。請參閱http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?RESTAuthentication.html。 Ruby庫(如Fog和Carrierwave)已經內置了對已驗證URL的支持。 – randomguy