javascript - एक्सप्रेस का उपयोग कर नोडजेएस सर्वर से एक फ़ाइल डाउनलोड करें




node.js file (4)

res.download() उपयोग करें res.download()

यह फ़ाइल को "अनुलग्नक" के रूप में पथ में स्थानांतरित करता है। उदाहरण के लिए:

var express = require('express');
var router = express.Router();

// ...

router.get('/:id/download', function (req, res, next) {
    var filePath = "/my/file/path/..."; // Or format the path using the `id` rest param
    var fileName = "report.pdf"; // The default name the browser will use

    res.download(filePath, fileName);    
});

मैं अपने सर्वर में एक फ़ाइल को कैसे डाउनलोड कर सकता हूं जो मेरी मशीन पर किसी नोडजेएस सर्वर में किसी पृष्ठ तक पहुंच सकता है?

मैं एक्सप्रेसजेएस का उपयोग कर रहा हूं और मैं इसे आजमा रहा हूं:

app.get('/download', function(req, res){

  var file = fs.readFileSync(__dirname + '/upload-folder/dramaticpenguin.MOV', 'binary');

  res.setHeader('Content-Length', file.length);
  res.write(file, 'binary');
  res.end();
});

लेकिन मुझे फ़ाइल का नाम और फ़ाइल प्रकार (या एक्सटेंशन) नहीं मिल रहा है। क्या कोई मेरी यह मदद कर सकता है?


अद्यतन करें

जीवन को आसान बनाने के लिए एक्सप्रेस के लिए एक सहायक है।

app.get('/download', function(req, res){
  var file = __dirname + '/upload-folder/dramaticpenguin.MOV';
  res.download(file); // Set disposition and send it.
});

पुराना उत्तर

जहां तक ​​आपका ब्राउज़र चिंतित है, फ़ाइल का नाम सिर्फ 'डाउनलोड' है, इसलिए आपको इसे अन्य HTTP शीर्षलेख का उपयोग करके अधिक जानकारी देना होगा।

res.setHeader('Content-disposition', 'attachment; filename=dramaticpenguin.MOV');

आप इस तरह के एक माइम प्रकार भी भेजना चाह सकते हैं:

res.setHeader('Content-type', 'video/quicktime');

यदि आप कुछ और गहराई से चाहते हैं, तो यहां जाएं।

var path = require('path');
var mime = require('mime');
var fs = require('fs');

app.get('/download', function(req, res){

  var file = __dirname + '/upload-folder/dramaticpenguin.MOV';

  var filename = path.basename(file);
  var mimetype = mime.lookup(file);

  res.setHeader('Content-disposition', 'attachment; filename=' + filename);
  res.setHeader('Content-type', mimetype);

  var filestream = fs.createReadStream(file);
  filestream.pipe(res);
});

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

यहां ध्यान देने योग्य एक और महत्वपूर्ण बात यह है कि मैंने रीडस्ट्रीम का उपयोग करने के लिए अपना कोड बदल दिया है। यह चीजों को करने का एक बेहतर तरीका है क्योंकि नाम में 'सिंक' के साथ किसी भी विधि का उपयोग करना इस पर फंस गया है क्योंकि नोड एसिंक्रोनस होने का मतलब है।


पीडीएफ, वर्ड डॉक्स इत्यादि जैसी स्थिर फ़ाइलों के लिए बस अपनी कॉन्फ़िगरेशन में एक्सप्रेस का स्थिर फ़ंक्शन का उपयोग करें:

// Express config
var app = express().configure(function () {
    this.use('/public', express.static('public')); // <-- This right here
});

और फिर बस अपनी सभी फाइलें उस 'सार्वजनिक' फ़ोल्डर के अंदर रखें, उदाहरण के लिए:

/public/docs/my_word_doc.docx

और फिर एक नियमित पुराना लिंक उपयोगकर्ता को इसे डाउनलोड करने की अनुमति देगा:

<a href="public/docs/my_word_doc.docx">My Word Doc</a>

यहां बताया गया है कि मैं इसे कैसे करता हूं:

  1. फाइल बनाएं
  2. ग्राहक को फाइल भेजें
  3. फ़ाइल को हटाएं

कोड:

let fs = require('fs');
let path = require('path');

let myController = (req, res) => {
  let filename = 'myFile.ext';
  let absPath = path.join(__dirname, '/my_files/', filename);
  let relPath = path.join('./my_files', filename); // path relative to server root

  fs.writeFile(relPath, 'File content', (err) => {
    if (err) {
      console.log(err);
    }
    res.download(absPath, (err) => {
      if (err) {
        console.log(err);
      }
      fs.unlink(relPath, (err) => {
        if (err) {
          console.log(err);
        }
        console.log('FILE [' + filename + '] REMOVED!');
      });
    });
  });
};





download