रूबी ऑन रेल्स में send_data और send_file के बीच क्या अंतर है?


जवाबों:


109
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 )

1
धन्यवाद @ fl00r क्या Send_data फ़ंक्शन का उपयोग करके डेटा को फ़ाइल के रूप में सहेजने और फिर भेजने का तरीका है ?। क्योंकि, मुझे अपने सर्वर में फ़ाइल की एक प्रति चाहिए थी। मैं उसे कैसे प्राप्त कर सकता हूं?।
श्री काले

आपके कोड में एक त्रुटि है: यह होना चाहिए { |f| f << data }
ट्रू सॉफ्ट

नमस्ते, मैं सोच रहा हूँ कि क्या यह उत्तर अभी भी प्रासंगिक है? मैं अब रेल 3.2.16 का उपयोग कर send_fileरहा हूं और इसका उपयोग करने के लिए मुझे फ़ाइल का उपयोग करना होगा, न कि पथ को काम करने के लिए। इस मामले में दूसरों को चलाने के मामले में बस अपडेट करना चाहते थे?
फायरड्रैगन

20

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एसेट पाइपलाइन गाइड पर चर्चा की गई है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.