2012-10-17 8 views
14

अभी मैं अमेज़ॅन एस 3 और पेपरक्लिप का उपयोग कर रहा हूं जो मेरे उपयोगकर्ताओं को एक ऐसी छवि अपलोड करने की इजाजत दे रहा है जो वे बना रहे हैं। मेरा अंतिम लक्ष्य यह है कि अन्य लोग इस घटना को देख सकते हैं, छवि पर क्लिक करने में सक्षम होने के लिए और इसे अपने कंप्यूटर पर सहेजने के लिए संकेत दें। अभी तक, लिंक पर क्लिक करने से ब्राउज़र विंडो में छवि खुल जाएगी। इसके बजाय मैंने उन्हें इसके बजाय डाउनलोड करने के लिए कहा है। सभी छवियां केवल एस 3 पर सहेजी गईं, स्थानीय नहीं। उजागर S3 यूआरएल को छिपाने के लिए और साथ ही यदि संभव हो या यह छलावरणएस 3 स्टोरेज से फ़ाइल डाउनलोड करने के लिए उपयोगकर्ता को अनुमति देना

यहाँ मेरी मौजूदा सेटअप

है 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

यह काम करने के लिए, मैं 'बस नियंत्रक में कोई नया कार्य जोड़ दिया है, तो आपके मामले में यह हो सकता है:

#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 

संपादित करें: डाउनलोड नियंत्रक कार्रवाई के लिए सही समाधान पाया जा सकता है (मैं कोड अब नवीनीकृत किया है ove): Force a link to download an MP3 rather than play it?

+0

आप कमाल कर रहे हैं! इस विचार को लिया और इसे मेरे आवेदन के लिए काम करने के लिए थोड़ा सा बदल दिया: – RubyNewbie

0

आप "लगाव" अपने HTTP प्रतिक्रिया हेडर में करने के लिए "सामग्री-विन्यास" सेट करना होगा। तो बस गूगल यह और आप उदाहरण के बहुत सारे देखेंगे - - मैं एक रेल डेवलपर नहीं कर रहा हूँ लेकिन यह शायद इस तरह दिखता है:

: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 में dyno के समय की बचत), मैं नहीं बल्कि कुछ इस तरह करना होगा:

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

प्रतिभा! यह आश्चर्यजनक रूप से एस 3 से डाउनलोड करने के लिए काम करता था, रूबी प्रक्रिया को टाई नहीं, पहले सर्वर पर डाउनलोड नहीं कर रहा था, और उपयोगकर्ता को दूर नहीं भेज रहा था। बहुत बढ़िया –

+0

प्लस, इसे नियंत्रक में एक और कार्रवाई की आवश्यकता नहीं है। –

+1

s3 (send_data और send_file समाधान हर जगह) से फ़ाइलों को डाउनलोड करने के लिए कई अन्य उत्तरों पढ़ें, लेकिन यह सबसे संक्षिप्त था और सीधे बल्ले के सही काम के साथ सीधे काम किया। –

2
अब एडब्ल्यूएस-SDK v2 में

, वहाँ एक विधि है: presigned_url Aws में परिभाषित :: 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 
संबंधित मुद्दे