2008-09-11 11 views
14

मैं जल्द ही एक प्रोजेक्ट शुरू करने जा रहा हूं जिसके लिए बड़ी-आश बाइनरी फ़ाइलों के लिए समर्थन की आवश्यकता है। मैं वेबपैड के लिए रेल पर रूबी का उपयोग करना चाहता हूं, लेकिन मुझे बीएलओबी समर्थन से चिंतित है। अन्य भाषाओं, ढांचे और डेटाबेस के साथ अपने अनुभव में, बीएलओबी को अक्सर अनदेखा किया जाता है और इस प्रकार खराब, कठिन, और/या छोटी गाड़ी कार्यक्षमता होती है।रेल बाइनरी स्ट्रीम समर्थन

क्या आरओआर पर्याप्त रूप से बीएलओबी खर्च करता है? क्या आप पहले से ही रेल के लिए प्रतिबद्ध होने के बाद कोई गठजोड़ कर रहे हैं?

बीटीडब्ल्यू: मैं बैकएंड डेटाबेस के रूप में PostgreSQL और/या MySQL का उपयोग करना चाहता हूं। जाहिर है, अंतर्निहित डेटाबेस में बीएलओबी समर्थन महत्वपूर्ण है। फिलहाल, मैं डीबी की बीएलओबी क्षमताओं पर ध्यान केंद्रित करना चाहता हूं; मुझे रूचि है कि रेल खुद कैसे प्रतिक्रिया करता है। आदर्श रूप से, रेल मुझे डेटाबेस से ब्योरा छिपाना चाहिए, और इसलिए मुझे एक से दूसरे में स्विच करने में सक्षम होना चाहिए। यदि यह मामला नहीं है (यानी: किसी विशेष डीबी के साथ रेल का उपयोग करने में कुछ समस्या है) तो कृपया इसका उल्लेख करें।

अद्यतन: इसके अलावा, मैं यहां ActiveRecord के बारे में बात नहीं कर रहा हूं। मुझे HTTP पक्ष पर बाइनरी फ़ाइलों को संभालने की आवश्यकता होगी (फाइल अपलोड प्रभावी ढंग से)। इसका मतलब रेल के माध्यम से उचित HTTP शीर्षलेखों और धाराओं तक पहुंच प्राप्त करना है। मैंने इसे प्रतिबिंबित करने के लिए प्रश्न शीर्षक और विवरण अपडेट किया है।

उत्तर

8

attachment_fu

मैं अपने ऐप्स में से एक में attachment_fu का उपयोग करें और चाहिए (कष्टप्रद कारण हैं जो इस convo के दायरे से बाहर कर रहे हैं के लिए) डीबी में फ़ाइलों को स्टोर करने के लिए +1।

(एक?) डब्ल्यू/बीएलओबी के साथ काम करने वाली मुश्किल चीज यह है कि आपको उपयोगकर्ता को डेटा भेजने के लिए एक अलग कोड पथ की आवश्यकता है - आप बस फाइल सिस्टम जैसे पथ को इनलाइन नहीं कर सकते यदि आप एक सादे-जेन फ़ाइल थी तो आप करेंगे।

उदा। आप अवतार जानकारी संग्रहीत कर रहे हैं, तो आप बस नहीं कर सकते:

<%= image_tag @youruser.avatar.path %> 

आप कुछ आवरण तर्क लिखने और send_data, उदा का उपयोग करना (नीचे व्यवहार में सिर्फ एक उदाहरण डब्ल्यू/attachment_fu है, तो आप इस सूख नहीं करनी होंगी)

send_data(@youruser.avatar.current_data, :type => @youruser.avatar.content_type, :filename => @youruser.avatar.filename, :disposition => 'inline') 

दुर्भाग्य से, (मैं नवीनतम संस्करण नहीं है) चालाक नहीं करता है के रूप में जहाँ तक मुझे पता है attachment_fu आपके लिए लपेटना - आपको इसे स्वयं लिखना होगा।

पीएस अपना प्रश्न संपादित करना - अटैचमेंट_फू आपके द्वारा उल्लेखित सभी परेशान सामग्री को संभालता है - फ़ाइल पथ और सभी बकवास को जानने की आवश्यकता के बारे में - डीबी में संग्रहीत करते समय एक छोटी सी समस्या के अलावा। कोशिश करो; यह रेल ऐप के लिए मानक है। यदि आप पहिया को पुन: आविष्कार करने का आग्रह करते हैं, तो attachment_fu के स्रोत कोड को अधिकांश गॉचास भी दस्तावेज करना चाहिए!

5

आप अपने ActiveRecord प्रवास में :binary प्रकार का उपयोग कर सकते हैं और यह भी अधिकतम आकार विवश :

class BlobTest < ActiveRecord::Migration 
    def self.up 
    create_table :files do |t| 
     t.column :file_data, :binary, :limit => 1.megabyte 
    end 
    end 
end 

ActiveRecord रूबी स्ट्रिंग के रूप में बीएलओबी (या सीएलओबी) सामग्री का खुलासा करता है।

0

प्लगइन में देखें, x_send_file भी।

"XSendFile प्लगइन एक्स-सेंडफ़ाइल HTTP शीर्षलेख के माध्यम से फ़ाइलों को भेजने के लिए एक सरल इंटरफ़ेस प्रदान करता है। यह आपके वेब सर्वर को आपकी रेल प्रक्रिया के माध्यम से स्ट्रीम करने के बजाय सीधे डिस्क से फ़ाइल की सेवा करने में सक्षम बनाता है। यह तेज़ और बचाता है यदि आप Mongrel का उपयोग कर रहे हैं तो बहुत सारी मेमोरी। हर वेब सर्वर इस हेडर का समर्थन नहीं करता है। वाईएमएमवी। "

मुझे यकीन नहीं है कि यह ब्लॉब्स के साथ प्रयोग योग्य है, तो यह फ़ाइल सिस्टम पर फ़ाइलों के लिए हो सकता है। लेकिन आपको शायद कुछ ऐसी चीज चाहिए जो वेब सर्वर को डेटा के बड़े हिस्से को स्ट्रीम नहीं कर पाती है।

13

स्ट्रीमिंग के लिए, आप इसे सभी (कम से कम स्मृति-) कुशल तरीके से कर सकते हैं। अपलोड पक्ष पर, रूपों में फ़ाइल मापदंडों को आईओ ऑब्जेक्ट्स के रूप में सारित किया जाता है जिन्हें आप पढ़ सकते हैं; डाउनलोड तरफ, render :text => का रूप है कि एक प्रोक तर्क लेता करने के लिए लग रही है:

render :content_type => 'application/octet-stream', :text => Proc.new { 
    |response, output| 
    # do something that reads data and writes it to output 
} 

अपना सामान डिस्क पर फ़ाइलों में है, तो हालांकि, ऊपर उल्लिखित समाधान निश्चित रूप से बेहतर काम करेगा।

+0

रेल में अब [send_data] (http://apidock.com/rails/ActionController/DataStreaming/send_data) है। – m33lky

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