2010-01-26 34 views
16

मैं एक रेल ऐप को बनाए रख रहा हूं जिसमें सार्वजनिक/फ़ोल्डर में सामग्री है जिसे अब लॉगिन द्वारा संरक्षित करने की आवश्यकता होगी। हम फ़ाइलों के उन फ़ोल्डरों को सार्वजनिक रूप से बाहर रास्ते में ले जाने/और सामग्री को पूरा करने के लिए रेल नियंत्रक लिखने पर विचार कर रहे हैं।जनता की सामग्री/रेल ऐप में

इससे पहले कि हम इसे लिखना शुरू करें, मैं उत्सुक था अगर कोई और इस तरह की समस्या में भाग गया है? मैंने कुछ रत्न/प्लगइन्स की तलाश की जो पहले से ही ऐसा कर सकते हैं लेकिन कुछ भी नहीं मिला। क्या किसी ने इसके लिए एक मणि बनाया है?

उत्तर

2

आप अमेज़ॅन एस 3 का उपयोग कर सकते हैं। आप अपने सुरक्षित क्षेत्र के पीछे यूआरएल उत्पन्न करने और सेवा करने के लिए नियंत्रकों का उपयोग कर सकते हैं, और इसमें एक ऐसी सुविधा भी है जो मूल रूप से यूआरएल उत्पन्न होने के बाद केवल कुछ निश्चित समय के लिए संसाधन उपलब्ध कराती है।

इस यूआरएल की जाँच करें: http://docs.amazonwebservices.com/AmazonS3/2006-03-01/index.html?RESTAuthentication.html

0

आप अपने रेल प्रमाणीकरण और प्राधिकरण प्रणाली के साथ सामग्री वितरण टाई चाहते हैं, तो आप अनिवार्य रूप से एक नियंत्रक के पीछे सामग्री डाल करने के लिए की है।

यदि आप एक अधिक सरल लॉगिन दृष्टिकोण देख रहे हैं, तो आप इसे अपने होस्टिंग वातावरण में HTTP एथ और सेटिंग्स (उदाहरण के लिए htaccess का उपयोग करके) के साथ संभाल सकते हैं।

16

मैंने इसे ऐसी साइट पर किया है जहां लोग कुछ फ़ाइलों को डाउनलोड करने के लिए भुगतान करते हैं, और फ़ाइलों को 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 सामग्री प्रकार से छुटकारा पाएं)।

+5

यह अंतर्निहित send_file विधि का उपयोग क्यों नहीं कर रहा है? –

+3

क्योंकि मुझे इसके बारे में पता नहीं था! इस तकनीक का उपयोग करने वाले किसी भी व्यक्ति को मेरी अपंग 'send_file' विधि परिभाषा को हटा देना चाहिए और इसके बजाय रेल-शामिल' send_file पथ, प्रकार => "एप्लिकेशन/पीडीएफ", x_sendfile => true' को कॉल करना चाहिए। नोट के लिए धन्यवाद, रयान। –

+0

मैंने 'एक्स-सेंडफाइल' पर आगे टिप्पणी की है: http://stackoverflow.com/a/26884350/895245 –

1

AFAIK, X-SendFile nginx द्वारा समर्थित नहीं है। एनजिनक्स का अपना विस्तार विस्तार है, जिसे एक्स-एक्सेल-रीडायरेक्ट कहा जाता है।

आप यहाँ इस बारे में अधिक जानकारी मिल जाएगा: https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile/

वहाँ भी एक रेल इस सुविधा implementig प्लगइन GitHub पर है,: goncalossilva/X-Accel-Redirect

0

फ़ाइल बनाना उपलब्ध है तो अप्रत्याशित यूआरएल पर एक सरल है समाधान वर्तमान में कुछ उत्पादन प्रणालियों में उपयोग किया जाता है।

ईजी .: गिटलैब।निम्न छवि एक निजी भंडार, https://gitlab.com/cirosantilli/test-private/issues/1 का एक मुद्दा पर अपलोड किया गया है, लेकिन आप अभी भी इसे देख सकते हैं:

नोट unguessable 90574279de उपसर्ग स्वचालित रूप से URL में जोड़े।

बिटबकेट (गैर-रेल) इस तकनीक का भी उपयोग करता है।

संबंधित मुद्दे