2011-04-04 16 views
61

आप व्याख्या कर सकते हैं, क्या send_data और send_file के बीच अलग है।अंतर, उदाहरण के साथ

स्ट्रीमिंग और फ़ाइल डाउनलोड प्रक्रिया के लिए कौन सा सबसे अच्छा है?

उत्तर

84
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) 
+0

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

+1

संभोग। Send_file के रूप में वैसे ही। मेरा अपडेट देखें – fl00r

+0

आपके कोड में कोई त्रुटि है: यह '{| f | होना चाहिए। एफ << डेटा} '। –

12

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 पर चर्चा की गई है।

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