आप व्याख्या कर सकते हैं, क्या send_data और send_file के बीच अलग है।अंतर, उदाहरण के साथ
स्ट्रीमिंग और फ़ाइल डाउनलोड प्रक्रिया के लिए कौन सा सबसे अच्छा है?
आप व्याख्या कर सकते हैं, क्या send_data और send_file के बीच अलग है।अंतर, उदाहरण के साथ
स्ट्रीमिंग और फ़ाइल डाउनलोड प्रक्रिया के लिए कौन सा सबसे अच्छा है?
send_data(_data_, options = {})
send_file(_path_, options = {})
मुख्य अंतर यह है कि यहाँ आप send_file साथ send_data या फ़ाइल पथ के साथ आंकड़े (बाइनरी कोड या जो कुछ भी) पास है।
तो आप कुछ डेटा जेनरेट कर सकते हैं और इसे 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)
send_file तेजी send_data से
fl00r mentioned के रूप में, send_file
एक रास्ता लेता है, और send_data
डेटा हो सकता है।
इसलिए send_file
के रूप में आप फाइल सिस्टम पर एक फ़ाइल की जरूरत है, send_data
के एक सबसेट है: आप निश्चित रूप से सिर्फ फ़ाइल को पढ़ने और उस पर send_data
इस्तेमाल कर सकते हैं। लेकिन send_file
तेज हो सकता है, इसलिए यह एक प्रदर्शन/सामान्यता व्यापार-बंद है।
send_file
तेजी से हो सकता है क्योंकि यह फ़ाइल सामग्री के बजाय अपाचे (X-Accel-Redirect
पर Nginx) पर X-Sendfile
शीर्षलेख भेज सकता है, क्योंकि यह पथ जानता है।
यह हेडर रिवर्स प्रॉक्सी (अपाचे या निगेंक्स) द्वारा उपभोग किया जाता है जो आमतौर पर उत्पादन सेटअप में रेल के सामने चलता है।
यदि प्रतिक्रिया पर मौजूद है, तो रिवर्स प्रॉक्सी वर्तमान प्रतिक्रिया के अधिकांश को अनदेखा करता है, और एक नया बनाता है जो दिए गए पथ पर फ़ाइल लौटाता है।
Client <---> Internet <---> Reverse proxy <---> Rails
यह बहुत अधिक कुशल के बाद रिवर्स प्रॉक्सी अत्यधिक स्थिर फ़ाइलों की सेवा में विशेषज्ञता प्राप्त है, और यह रेल की तुलना में बहुत तेजी से (यदि भेजा जाएगा जो फ़ाइल डेटा नहीं भेजता है) कर सकते हैं।
send_file
का सामान्य उपयोग केस तब होता है जब आप स्थैतिक फ़ाइलों की पहुंच अनुमति को नियंत्रित करना चाहते हैं: आप उन्हें /public
के तहत नहीं डाल सकते हैं या अन्यथा रेलों को निर्णय लेने का मौका मिलने से पहले उन्हें सेवा मिल जाएगी। इस पर चर्चा की है: Protecting the content of public/ in a Rails app
आदेश हेडर का उपयोग करने के लिए आपको जोड़ने के लिए:
config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
confing/initializers/production.rb
(नहींapplication.rb
, के बाद से विकास में आप किसी प्रॉक्सी सर्वर की जरूरत नहीं है और आप वास्तव में डेटा भेजने के लिए send_file
चाहते हैं)।
पर चर्चा Asset Pipeline Guide पर चर्चा की गई है।
धन्यवाद @ fl00r। क्या डेटा को फ़ाइल के रूप में सहेजने का तरीका है और फिर send_data फ़ंक्शन का उपयोग करके भेजना है? क्योंकि, मुझे अपने सर्वर में फ़ाइल की एक प्रति की आवश्यकता है। मैं उसे कैसे प्राप्त कर सकता हूं?। –
संभोग। Send_file के रूप में वैसे ही। मेरा अपडेट देखें – fl00r
आपके कोड में कोई त्रुटि है: यह '{| f | होना चाहिए। एफ << डेटा} '। –