2010-05-02 13 views
5

रूबी में निजी तस्वीरें और वीडियो स्टोर करने के लिए यहाँ एक कहानी है:कैसे ऑन रेल्स

  • उपयोगकर्ता A कोई चित्र अपलोड करने में सक्षम होना चाहिए।
  • उपयोगकर्ता ए गोपनीयता स्थापित करने में सक्षम होना चाहिए। ("सार्वजनिक" या "निजी")।
  • उपयोगकर्ता B

मैं अपलोड से निपटने के लिए उपयोगकर्ता Paperclip करने की योजना बना रहा हूँ उपयोगकर्ता A की "निजी" छवियों उपयोग करने में सक्षम नहीं होना चाहिए।

यदि मैं छवियों को "RAILS_ROOT/public/images" के अंतर्गत संग्रहीत करता हूं, तो जो भी फाइल का नाम अनुमान लगा सकता है, वह फ़ाइलों तक पहुंच सकता है। (उदाहरण के लिए, http://example.com/public/images/uploads/john/family.png एक्सेस करने वाले)

मैं img टैग का उपयोग कर छवियों दिखाने की जरूरत है, तो मैं public को छोड़कर एक फ़ाइल नहीं लगा सकेंगे।

मैं कैसे सुनिश्चित कर सकता हूं कि उपयोगकर्ता या समूह की छवियां दूसरों द्वारा उपलब्ध नहीं हैं?

(अगर मैं पेपरक्लिप साथ इस लक्ष्य को हासिल नहीं कर सकते, एक अच्छा समाधान क्या है?)

उत्तर

4

मैं पेपरक्लिप होता निजी करने के लिए बैक-एंड पर S3 का उपयोग करें, अपलोड की गई फ़ाइलों निर्धारित करते हैं, और उसके बाद करने के लिए उपयोग "क्वेरी स्ट्रिंग अनुरोध प्रमाणीकरण वैकल्पिक" मेरे छवि टैग के लिए यूआरएल उत्पन्न करें।

http://docs.amazonwebservices.com/AmazonS3/2006-03-01/index.html?RESTAuthentication.html

+0

यह एक बहुत ही अच्छा विचार है - खासकर क्लाउडफ्रंट के साथ। – Zack

+0

हां, यह बहुत अच्छा काम करता है। कॉलमेड ने एक ही समय में एक ही चीज़ पोस्ट की, लेकिन वह कुछ कोड भी दिखाता है। उन्होंने जो पोस्ट किया है उस पर एक अच्छा नज़र डालें और इसे गंभीर विचार दें। – jdl

8

आप अपने रेल सर्वर उत्पादन छवि फ़ाइलों की सामग्री को कर सकते हैं। यह एक नियंत्रक कार्रवाई के माध्यम से किया जाता है (अधिकांश कार्यों एचटीएमएल प्रिंट करते हैं, लेकिन यह एक जेपीजी मुद्रित करेगा, उदाहरण के लिए)।

फिर आप नियंत्रक स्तर पर तक पहुंच प्रतिबंधित करने के लिए अपनी प्राधिकरण प्रणाली का उपयोग कर सकते हैं!

class ImagesController 
    #Default show Image method streams the file contents. 
    #File doesn't have to be in public/ dir 
    def show 
    send_file @image.filename, :type => @image.content_type, 
       :disposition => 'inline' 
    end 

    # Use your favorite authorization system to restrict access 
    filter_access_to :show, :require => :view, :attribute_check => :true 
end 

एचटीएमएल कोड में आप उपयोग कर सकते हैं:

<img src="/images/show/5" /> 
+0

धन्यवाद। यह दिलचस्प है। मैं इसमें देख लूंगा। –

+2

इस मामले में वेबसर्वर को 'send_file' द्वारा भेजी गई फ़ाइलों की सेवा करने देना उचित है। अपाचे में एनजिनक्स में 'एक्स-एक्सेल-रीडायरेक्ट' या 'एक्स-सेंडफाइल' पर नज़र डालें। उपयोगी लिंक: [1] (http://maxresponsemedia.com/rails/nginx-x-accel-redirect-setup-in-rails-3/), [2] (http://thedataasylum.com/articles/how -राइल्स-nginx-x-accel-redirect-work-together.html), [3] (http://airbladesoftware.com/notes/rails-nginx-x-accel-mapping), [4] (http://www.therailsway.com/2009/2/22/file-downloads-done-right/)। – mrzasa

4

यहाँ मैं कैसे एक समान आवेदन में ऐसा किया है।

  • स्थानीय फाइल सिस्टम के बजाय अमेज़ॅन एस 3 पर अपनी छवियों को स्टोर करें। पेपरक्लिप इसका समर्थन करता है।
  • अपने पेपरक्लिप विकल्पों में अपने "s3_permissions" निजी "पर सेट करें
  • अपने छवि मॉडल में, एक विधि को परिभाषित करें जो आपको छवि के लिए अधिकृत, समय-सीमित यूआरएल आउटपुट करने देता है।

मेरा इस तरह दिखता है:

def s3_url(style = :original, time_limit = 30.minutes) 
    self.attachment.s3.interface.get_link(attachment.s3_bucket.to_s, attachment.path(style), time_limit) 
end 
  • फिर आप लोगों के लिए छवियों को केवल अगर वे उन्हें देखने के लिए (लागू है कि जैसे आप चाहें) और के बारे में चिंता करने की ज़रूरत नहीं अधिकृत दिखा सकते हैं निजी छवियों का अनुमान लगाने/देखने वाले लोग। यह उन्हें समाप्त होने के बाद से यूआरएल पास करने से भी रोकता है (यूआरएल में एक टोकन है)।
  • चेतावनी दीजिये कि आपके ऐप के लिए प्रत्येक छवि के लिए अधिकृत यूआरएल उत्पन्न करने में समय लगता है। इसलिए, यदि आपके पास किसी पृष्ठ पर कई छवियां हैं, तो यह लोड समय को प्रभावित करेगी।
+0

क्या आपके पास छवि पढ़ने वाले भारी अनुप्रयोगों के लिए इस दृष्टिकोण को अनुकूलित करने पर कोई सुझाव है? ऐसा लगता है कि मेरे पास बहुत अधिक ऐप हिट होने जा रहे हैं ... – Jared

1

यदि आप स्वयं फ़ाइलों को होस्ट करना चाहते हैं, तो आप कंट्रोलर स्तर पर प्रमाणीकरण कर सकते हैं जैसा सुझाव दिया गया है। मेरे अनुप्रयोगों में से एक में एसेट कंट्रोलर है जो उदाहरण के लिए 'निजी' निर्देशिका से फ़ाइलों की सेवा करता है।

एक चीज जो मैं जोड़ना चाहता था वह यह है कि आपको X-Sendfile सेट अप करने के लिए this guide की समीक्षा करनी चाहिए, जो आपके एप्लिकेशन को वेब सर्वर को वास्तव में फ़ाइलों को भेजने के लिए कहने देगी। आप इस दृष्टिकोण के साथ बेहतर प्रदर्शन देखेंगे।

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