Nodejs जवाब में फ़ाइल भेजते हैं


113

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

जवाबों:


183

यहां एक उदाहरण कार्यक्रम है जो 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/ से लिया गया


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

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

6
use.pump (readStream, response); मूल्यह्रास है ... readStream.pipe (प्रतिक्रिया) का उपयोग करें;
आफ्टरशॉक

1
यह सुरक्षित नहीं है। देखें: stackoverflow.com/questions/20449055/node-js-stream-api-leak
Kr0e

@ अब्दुल मुझे यकीन नहीं है कि मैं आपका प्रश्न समझता हूँ; मुझे एक ईमेल शूट करना चाहते हैं ?
मिशेल टाइली

13

आपको एक प्रतिक्रिया में फ़ाइल (संग्रह) भेजने के लिए स्ट्रीम का उपयोग करने की आवश्यकता है, आपके प्रतिक्रिया शीर्षक में उपयुक्त सामग्री-प्रकार का उपयोग करने के लिए आपके पास और क्या है।

एक उदाहरण कार्य है जो इसे करता है:

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");
      }
    });
  }
}

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

"एप्लिकेशन / ऑक्टेट-स्ट्रीम" को RFC 2046 में "मनमाना द्विआधारी डेटा" के रूप में परिभाषित किया गया है, इस सामग्री-प्रकार का उद्देश्य डिस्क को सहेजना है - यह वही है जो आपको वास्तव में चाहिए।

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

अधिक जानकारी के लिए कृपया इस स्टैकओवरफ़्लो विषय को देखें ।


क्लाइंट साइड में कॉल रिक्वेस्ट कैसे क्लाइंट साइड कोड देते हैं
ashwini

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