2012-10-17 6 views
14

Im Moment benutze ich Amazon S3 und Paperclip, die meinen Benutzern erlauben, ein Bild hochzuladen, das mit dem Ereignis verbunden ist, das sie verursachen. Mein ultimatives Ziel ist es, dass andere dieses Ereignis sehen können, um auf das Bild klicken zu können und es SPEICHERN AN ihrem Computer zu veranlassen. Wenn Sie jetzt auf den Link klicken, wird das Bild in einem Browserfenster geöffnet. Ich möchte lieber, dass sie stattdessen herunterladen. Alle Bilder werden nur auf S3 gespeichert, nicht lokal. Sie benötigen ausgesetzt s3 URL zu verstecken und wenn möglich oder es tarnenDem Benutzer erlauben, Datei von S3-Speicher zu laden

Hier ist meine aktuelle Setup

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' 

Hoffe, dass mir jemand helfen kann.

Antwort

16

Um diese Arbeit zu machen, ich habe soeben eine neue Aktion in der Steuerung, so in Ihrem Fall könnte es sein:

#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 

EDIT: die richtige Lösung für action herunterladen Controller finden sie hier (ich habe den Code ab aktualisiert ove): Force a link to download an MP3 rather than play it?

+0

Sie sind genial! Nahm diese Idee und änderte es ein wenig, um für meine Anwendung zu arbeiten: – RubyNewbie

0

Sie benötigen die "Content-Disposition" auf "Befestigung" in der HTTP-Antwort-Header zu setzen. Ich bin kein Rails Entwickler - so einfach es Google und Sie werden viele Beispiele sehen - aber es sieht wohl so etwas wie folgt aus:

:content_disposition => "attachment" 

oder

 ... 
    :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

zusätzliche Belastung für Ihre App zu vermeiden (Dyno Zeit in Heroku zu speichern), würde ich lieber etwas tun: diese Methode, um Ihr Modell mit dem Anhang hinzuzufügen:

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 

Und dann verwenden Sie es in Ihre Ansichten/Controller wie folgt aus:

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

Genius! Dies funktionierte wunderbar zum Herunterladen direkt von S3 aus, nicht um den Ruby-Prozess zu binden, nicht zuerst auf den Server herunterzuladen und den Benutzer nicht wegzuschicken. Super –

+0

Plus, es erfordert keine andere Aktion in der Steuerung. –

+1

Lesen Sie viele andere Antworten zum Herunterladen von Dateien von s3 (send_data und send_file Lösungen überall), aber das war am prägnantesten und gerade gerade arbeitete mit möglichst wenig Code aus der Fledermaus. –

2

Jetzt in v2 aws-sdk, gibt es eine Methode: presigned_url in Aws definiert :: S3 :: Object, Sie mit dieser Methode kann konstruieren der direkte runter Last-URL für ein s3 Objekt:

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'") 

dann in Ihre Ansichten, benutzen Sie einfach:

= link_to 'download', url 
Verwandte Themen