2012-04-06 8 views
75

एक्सप्रेसज फ्रेमवर्क में sendfile() विधि है। मैं पूरी ढांचे का उपयोग किए बिना ऐसा कैसे कर सकता हूं। मैं एक संग्रह बनाने के लिए नोड-देशी-ज़िप का उपयोग कर रहा हूं और मैं इसे उपयोगकर्ता को भेजना चाहता हूं।नोडज प्रतिक्रिया में फ़ाइल भेजते हैं

उत्तर

119

यहां एक उदाहरण प्रोग्राम है जो myfile.mp3 को डिस्क से स्ट्रीम करके भेज देगा (यानी, यह फ़ाइल भेजने से पहले पूरी फ़ाइल को स्मृति में नहीं पढ़ता है)। सर्वर पोर्ट पर सुनता 2000.

[अपडेट], टिप्पणी में @Aftershock ने उल्लेख किया util.pump चला गया है और pipe बुलाया स्ट्रीम प्रोटोटाइप पर एक विधि के साथ बदल दिया गया था के रूप में, नीचे दिया गया कोड इसे दर्शाता है।

var http = require('http'), 
    fileSystem = require('fs'), 
    path = require('path'); 

http.createServer(function(request, response) { 
    var filePath = path.join(__dirname, 'myfile.mp3'); 
    var stat = fileSystem.statSync(filePath); 

    response.writeHead(200, { 
     'Content-Type': 'audio/mpeg', 
     'Content-Length': stat.size 
    }); 

    var readStream = fileSystem.createReadStream(filePath); 
    // We replaced all the event handlers with a simple call to readStream.pipe() 
    readStream.pipe(response); 
}) 
.listen(2000); 

से http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/

+0

लेकिन मैं सर्वर से एक फाइल स्ट्रीम नहीं कर रहा हूं, मैं संग्रह – andrei

+0

बना देता हूं "स्ट्रीम" से मेरा मतलब है "कनेक्शन को फ़ाइल डेटा को पढ़ने के रूप में भेजना" जैसा कि "स्मृति में पूरी फ़ाइल को पढ़ने के विपरीत" उस डेटा को एक ही समय में कनेक्शन में भेजें "(जो सामान्य निष्पक्ष दृष्टिकोण है)। मैं _don't_ मतलब "डिस्क पर जाने के बिना स्मृति से डेटा स्ट्रीम करें।" जो पोस्ट मैंने लिंक किया है वह अधिक विस्तार से बताता है। –

+0

ठीक है अब मैं इसे प्राप्त करता हूं, धन्यवाद। मैं वहां से शुरू करूंगा – andrei

3

आप एक जवाब में फ़ाइल (संग्रह) भेजने के लिए स्ट्रीम का उपयोग की जरूरत है लिया, और अधिक है कि क्या आप अपनी प्रतिक्रिया हेडर में उचित सामग्री-प्रकार का उपयोग करने के लिए है।

एक उदाहरण समारोह नहीं है यह करना है कि:

const fs = require('fs'); 

// Where fileName is name of the file and response is Node.js Reponse. 
responseFile = (fileName, response) => { 
    const filePath = "/path/to/archive.rar" // or any file format 

    // Check if file specified by the filePath exists 
    fs.exists(filePath, function(exists){ 
     if (exists) {  
     // Content-type is very interesting part that guarantee that 
     // Web browser will handle response in an appropriate manner. 
     response.writeHead(200, { 
      "Content-Type": "application/octet-stream", 
      "Content-Disposition": "attachment; filename=" + fileName 
     }); 
     fs.createReadStream(filePath).pipe(response); 
     } else { 
     response.writeHead(400, {"Content-Type": "text/plain"}); 
     response.end("ERROR File does not exist"); 
     } 
    }); 
    } 
} 

सामग्री प्रकार क्षेत्र के प्रयोजन के डेटा शरीर पूरी तरह से पर्याप्त है कि प्राप्त उपयोगकर्ता एजेंट एक उपयुक्त चुन सकते हैं में निहित वर्णन करने के लिए है उपयोगकर्ता को डेटा पेश करने के लिए एजेंट या तंत्र, या अन्यथा उचित तरीके से डेटा से निपटें।

"application/ओकटेट धारा" आरएफसी 2046 में "मनमाना बाइनरी डेटा" के रूप में परिभाषित किया गया है, इस सामग्री प्रकार के प्रयोजन के डिस्क को बचाया जा रहा है - यह क्या तुम सच में की जरूरत है।

"फ़ाइल नाम = [फ़ाइल का नाम]" फ़ाइल का नाम निर्दिष्ट करता है जिसे डाउनलोड किया जाएगा।

अधिक जानकारी के लिए कृपया this stackoverflow topic देखें।

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