स्ट्रीमिंग और फ़ाइल डाउनलोड के लिए कौन सा सबसे अच्छा है?
कृपया उदाहरण दें।
स्ट्रीमिंग और फ़ाइल डाउनलोड के लिए कौन सा सबसे अच्छा है?
कृपया उदाहरण दें।
जवाबों:
send_data(_data_, options = {})
send_file(_path_, options = {})
यहाँ मुख्य अंतर यह है कि आप DATA (बाइनरी कोड या जो कुछ भी भेजते हैं ) send_data या फाइल PATH के साथ send_file के साथ पास करते हैं ।
तो आप कुछ डेटा जनरेट कर सकते हैं और इसे एक इनलाइन टेक्स्ट के रूप में या send_data के माध्यम से अपने सर्वर पर फ़ाइल जनरेट किए बिना अटैचमेंट के रूप में भेज सकते हैं । या आप send_file के साथ तैयार फ़ाइल भेज सकते हैं
data = "Hello World!"
send_data( data, :filename => "my_file.txt" )
या
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_file( file )
परफॉमेंस के लिए एक बार फाइल जेनरेट करना बेहतर है और फिर इसे जितनी बार चाहें भेज दें। तो send_file
बेहतर फिट होगा।
स्ट्रीमिंग के लिए, जहां तक मैं समझता हूं, यह दोनों विधियां विकल्पों और सेटिंग्स के एक ही गुच्छा का उपयोग करती हैं, इसलिए आप एक्स-सेंड या जो भी उपयोग कर सकते हैं।
युपीडी
send_data और फ़ाइल सहेजें:
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_data( data )
{ |f| f << data }
।
send_file
रहा हूं और इसका उपयोग करने के लिए मुझे फ़ाइल का उपयोग करना होगा, न कि पथ को काम करने के लिए। इस मामले में दूसरों को चलाने के मामले में बस अपडेट करना चाहते थे?
send_file send_data से अधिक तेज़ हो सकता है
जैसा कि fl00r का उल्लेख है , send_file
एक पथ, और send_data
डेटा लेता है ।
इसलिए, send_file
का एक सबसेट है send_data
, जैसा कि आपको फ़ाइल सिस्टम पर एक फ़ाइल की आवश्यकता है: आप निश्चित रूप से केवल फ़ाइल पढ़ सकते हैं और send_data
उस पर उपयोग कर सकते हैं। लेकिन send_file
तेज हो सकता है, इसलिए यह एक प्रदर्शन / सामान्यता व्यापार-बंद है।
send_file
तेजी से हो सकता है क्योंकि यह फ़ाइल सामग्री के बजाय X-Sendfile
अपाचे X-Accel-Redirect
पर ( नगनेक्स पर) हेडर भेज सकता है, क्योंकि यह पथ जानता है।
इस हेडर को रिवर्स प्रॉक्सी (अपाचे या नग्नेक्स) द्वारा खपत किया जाता है जो आम तौर पर एक उत्पादन सेटअप में रेल के सामने चलता है।
यदि X-Sendfile
प्रतिक्रिया पर मौजूद है, तो रिवर्स प्रॉक्सी वर्तमान प्रतिक्रिया के अधिकांश को अनदेखा करता है, और एक नया बनाता है जो दिए गए पथ पर फ़ाइल लौटाता है।
Client <---> Internet <---> Reverse proxy <---> Rails
यह बहुत अधिक कुशल है क्योंकि रिवर्स प्रॉक्सी अत्यधिक स्थिर फ़ाइलों की सेवा करने में विशिष्ट है, और यह रेल्स की तुलना में बहुत तेज़ी से कर सकता है (जो फ़ाइल डेटा नहीं भेजता है यदि X-Sendfile
भेजा जाएगा)।
का विशिष्ट उपयोग मामला send_file
तब होता है जब आप स्थैतिक फ़ाइलों की पहुँच अनुमति को नियंत्रित करना चाहते हैं: आप उन्हें नीचे नहीं रख सकते हैं /public
अन्यथा उन्हें रेल से फैसला करने का मौका मिलेगा। इस पर चर्चा की जाती है: एक रेल एप्लिकेशन में जनता की सामग्री की सुरक्षा करना
X-Sendfile
शीर्ष लेख का उपयोग करने के लिए , आपको जोड़ना होगा:
config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
, config/initializers/production.rb
(या config/environment/production.rb
पटरियों 5.x में), नहीं application.rb
, क्योंकि विकास में आपके पास प्रॉक्सी सर्वर नहीं है और आप send_file
वास्तव में डेटा भेजना चाहते हैं ।
X-Sendfile
एसेट पाइपलाइन गाइड पर चर्चा की गई है ।