2012-10-17 59 views
14

現在我正在使用Amazon S3和Paperclip,它允許我的用戶上傳與正在創建的事件相關聯的圖像。我的最終目標是,因爲其他人可以查看此事件,以便能夠點擊圖像並提示保存到他們的計算機。到目前爲止,單擊該鏈接將在瀏覽器窗口中打開該圖像。我寧願要求他們下載。所有圖像只保存在S3上,而不是本地。需要隱藏暴露S3網址,以及如果可能的話或僞裝它允許用戶從S3存儲下載文件

這裏是我的當前設置

的Index.html

<%= link_to 'Download Creative', event.creative.url, class: "btn btn-info" %> 

Event.rb

has_attached_file :creative, 
       :styles => { :thumb => "150x150", :custcreative => "250x75" }, 
       :path => ":attachment/:id/:style.:extension", 
       :s3_domain_url => "******.s3.amazonaws.com", 
       :storage => :s3, 
       :s3_credentials => Rails.root.join("config/s3.yml"), 
       :bucket => '*****', 
       :s3_permissions => :public_read, 
       :s3_protocol => "http", 
       :convert_options => { :all => "-auto-orient" }, 
       :encode => 'utf8' 

希望有人能幫助我。

回答

16

爲了使這項工作,我「VE只是增加一個控制器中的新動作,所以你的情況可能是:

#routes 
resources :events do 
    member { get :download } 
end 

#index 
<%= link_to 'Download Creative', download_event_path(event), class: "btn btn-info" %> 

#events_controller 
def download 
    data = open(event.creative_url) 
    send_data data.read, :type => data.content_type, :x_sendfile => true 
end 

編輯: 下載控制器動作正確的解決方案可以在這裏找到(我已經更新了代碼AB OVE):Force a link to download an MP3 rather than play it?

+0

你是真棒!採取這個想法,並改變了一下爲我的應用程序工作: – RubyNewbie

0

您需要在HTTP響應標題中設置「Content-Disposition」至「附件」。我不是一個Rails開發者 - 所以只是谷歌它,你會看到很多的例子 - 但它可能看起來是這樣的:

:content_disposition => "attachment" 

 ... 
    :disposition => "attachment" 
1
event = Event.find(params[:id]) 
    data = open(event.creative.url) 
    send_data data.read, :type => data.content_type, :x_sendfile => true, :url_based_filename => true 
end 
26

爲了避免額外的負荷,你的應用程序(節省賽道在Heroku的時間),我寧願做這樣的事:這個方法添加到處理附件的型號:

def download_url(style_name=:original) 
    creative.s3_bucket.objects[creative.s3_object(style_name).key].url_for(:read, 
     :secure => true, 
     :expires => 24*3600,  # 24 hours 
     :response_content_disposition => "attachment; filename='#{creative_file_name}'").to_s 
end 

,然後用它在你的意見/控制器是這樣的:

<%= link_to 'Download Creative', event.download_url, class: "btn btn-info" %> 
+0

天才!這從S3中正確地下載完成,沒有捆綁Ruby進程,沒有先下載到服務器,也沒有發送用戶。真棒 –

+0

另外,它不需要控制器中的其他操作。 –

+1

從s3下載文件(到處都是send_data和send_file解決方案)可以閱讀很多其他答案,但這是最簡潔的,只需使用最少量的代碼即可直接運行。 –

2

現在AWS-SDK V2,有一個方法:在AWS定義presigned_url :: S3 ::對象,你可以用這個方法來構建直接向下對於S3目標負載網址:

s3 = Aws::S3::Resource.new 
# YOUR-OBJECT-KEY should be the relative path of the object like 'uploads/user/logo/123/pic.png' 
obj = s3.bucket('YOUR-BUCKET-NAME').object('YOUR-OBJECT-KEY') 
url = obj.presigned_url(:get, expires_in: 3600, response_content_disposition: "attachment; filename='FILENAME'") 

然後在您的看法,只需使用:

= link_to 'download', url 
相關問題