मैंने इसे ऐसी साइट पर किया है जहां लोग कुछ फ़ाइलों को डाउनलोड करने के लिए भुगतान करते हैं, और फ़ाइलों को RAILS_ROOT/private
में संग्रहीत किया जाता है। पहली बात यह जानना है कि आप वेब सर्वर को फ़ाइल भेजने में संभालना चाहते हैं, अन्यथा आपका ऐप बड़ी फाइलों को प्रेषित करने के लिए आयोजित किया जाएगा और यदि आपके पास किसी भी प्रकार की डाउनलोड वॉल्यूम है तो यह आपकी साइट को तुरंत रोक देगा। इसलिए, यदि आपको नियंत्रक में प्रमाणीकरण की जांच करने की आवश्यकता है, तो आपको वेब सर्वर पर डाउनलोड के नियंत्रण को पास करने के लिए भी एक तरीका चाहिए। ऐसा करने का सबसे अच्छा तरीका (जिसे मैं जानता हूं) एक्स-सेंडफाइल हेडर है, जिसे Nginx, Apache (मॉड्यूल के साथ) और अन्य द्वारा समर्थित किया जाता है। X-Sendfile कॉन्फ़िगर किए जाने पर, जब आपके वेब सर्वर को आपके ऐप से शीर्षलेख प्राप्त होता है, तो यह फ़ाइल को क्लाइंट को भेजता है।
एक बार जब आप है एक्स Sendfile अपने वेब सर्वर के लिए काम, इस तरह एक निजी नियंत्रक विधि उपयोगी है: जाहिर है
##
# Private file download: check permission first.
#
def download
product = Product.find_by_filename!(params[:filename])
if current_user.has_bought?(product) or current_user.is_superuser?
if File.exist?(path = product.filepath)
send_file path, :content_type => "application/pdf"
else
not_found
end
else
not_authorized
end
end
:
##
# Send a protected file using the web server (via the x-sendfile header).
# Takes the absolute file system path to the file and, optionally, a MIME type.
#
def send_file(filepath, options = {})
options[:content_type] ||= "application/force-download"
response.headers['Content-Type'] = options[:content_type]
response.headers['Content-Disposition'] = "attachment; filename=\"#{File.basename(filepath)}\""
response.headers['X-Sendfile'] = filepath
response.headers['Content-length'] = File.size(filepath)
render :nothing => true
end
फिर अपने नियंत्रक कार्रवाई कुछ इस तरह दिखाई दे सकता है आपकी प्राधिकरण विधि अलग-अलग होगी और यदि आप पीडीएफ के अलावा अन्य फाइलें पेश कर रहे हैं या आप ब्राउज़र में फाइल को देखना चाहते हैं तो आपको हेडर बदलना होगा (application/force-download
सामग्री प्रकार से छुटकारा पाएं)।
स्रोत
2010-01-26 23:12:09
यह अंतर्निहित send_file विधि का उपयोग क्यों नहीं कर रहा है? –
क्योंकि मुझे इसके बारे में पता नहीं था! इस तकनीक का उपयोग करने वाले किसी भी व्यक्ति को मेरी अपंग 'send_file' विधि परिभाषा को हटा देना चाहिए और इसके बजाय रेल-शामिल' send_file पथ, प्रकार => "एप्लिकेशन/पीडीएफ", x_sendfile => true' को कॉल करना चाहिए। नोट के लिए धन्यवाद, रयान। –
मैंने 'एक्स-सेंडफाइल' पर आगे टिप्पणी की है: http://stackoverflow.com/a/26884350/895245 –