2012-10-28 14 views
26

मैं उन ग्राहकों को सामग्री स्ट्रीम करना चाहता हूं जो संभावित रूप से डीबी में संग्रहीत हैं, जिन्हें वे फाइलों के रूप में सहेजते हैं।क्लाइंट में नोड/एक्सप्रेस में स्ट्रीम फ़ाइलें

स्पष्ट रूप से res.download अच्छी तरह से काम करेगा, लेकिन प्रतिक्रिया में से कोई भी नहीं। * फ़ंक्शन एक स्ट्रीम स्वीकार करते हैं, केवल फ़ाइल पथ।

मैंने res.download impl पर एक नज़र डाली थी और यह केवल सामग्री-डिस्पोजिशन हेडर सेट करता है और फिर एक sendfile सेट करता है।

तो मैं इस पोस्ट का उपयोग गाइड के रूप में प्राप्त कर सकता हूं। Node.js: pipe stream to response freezes over HTTPS

लेकिन ऐसा लगता है कि मैं प्रदर्शन करने वाले सभी रैपिंग पहलुओं पर ध्यान नहीं दूंगा।

क्या मुझे यहां कुछ याद आ रहा है या मुझे बस पाइप करना चाहिए और इसके बारे में चिंता न करें - यहां सबसे अच्छा अभ्यास क्या है?

वर्तमान में temp फ़ाइलों को बना रहा है, इसलिए मैं अभी res.download का उपयोग कर सकता हूं।

+0

उदाहरण के लिए इस विधि http://stackoverflow.com/questions/10207762/how-to-use-request-or-http-module-to-read-gzip-page-into-a- प्रयास करें स्ट्रिंग/10603029 # 10603029 –

उत्तर

63

आप सीधे प्रतिक्रिया ऑब्जेक्ट (यह एक स्ट्रीम है) पर स्ट्रीम कर सकते हैं।

एक मूल फ़ाइल स्ट्रीम इस तरह कुछ दिखाई देगी।

function(req, res, next) { 
    if(req.url==="somethingorAnother") { 
    res.setHeader("content-type", "some/type"); 
    fs.createReadStream("./toSomeFile").pipe(res); 
    } else { 
    next(); // not our concern, pass along to next middleware function 
    } 
} 

यह data और end घटनाओं के लिए बाध्य की देखभाल करेंगे।

+2

@ टिम आपको इसे उत्तर के रूप में चिह्नित करना चाहिए यदि यह आपके लिए काम करता है –

+0

अपवॉट्स को देखते हुए यह कई लोगों के लिए काम करता है और इसमें मुझे शामिल है। धन्यवाद! – jlh

+1

'req.url! ==" कुछ और अन्य "कॉल करने के लिए Remeber 'अगला' – Carlos

1

सुनिश्चित करें कि ग्राहक से आपके AJAX अनुरोध में उचित 'प्रतिक्रिया प्रकार' सेट है। जैसे

$http({ 
    method :'GET', 
    url : http://url, 
    params:{}, 
    responseType: 'arraybuffer' 
}).success() 
संबंधित मुद्दे