Pobierz Plik z serwera NodeJS za pomocą programu Express

Jak mogę pobrać plik, który znajduje się na moim serwerze, na mój komputer z dostępem do strony na serwerze nodeJS?

Używam ExpressJS i próbowałem tego:

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

Ale nie mogę pobrać nazwy pliku i typu pliku (lub rozszerzenia ). Czy ktoś może mi w tym pomóc?

Author: KARTHIKEYAN.A, 2011-09-03

6 answers

Update

Express ma pomocnika , aby ułatwić życie.

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

Stara Odpowiedź

Jeśli chodzi o przeglądarkę, nazwa pliku to po prostu "pobierz", więc musisz podać mu więcej informacji, używając innego nagłówka HTTP.

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

Możesz również wysłać typ mime, taki jak ten:

res.setHeader('Content-type', 'video/quicktime');
Jeśli chcesz czegoś bardziej szczegółowego, proszę bardzo.
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);
});

Możesz ustawić wartość nagłówka na dowolną. W tym przypadku używam biblioteka typu mime-node - mime, aby sprawdzić, jaki jest typ MIME pliku.

Kolejną ważną rzeczą jest to, że zmieniłem Twój kod, aby użyć strumienia odczytu. Jest to o wiele lepszy sposób na robienie rzeczy, ponieważ używanie dowolnej metody z 'Sync' w nazwie jest mile widziane, ponieważ node ma być asynchroniczny.

 419
Author: loganfsmyth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-23 00:40:54

Użycie res.download()

Przenosi plik na ścieżkę jako "załącznik". Na przykład:

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);    
});
 30
Author: Jossef Harush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-24 12:40:00

Dla plików statycznych, takich jak PDF, Word docs, itp. wystarczy użyć funkcji statycznej Express w konfiguracji:

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

A następnie po prostu umieść wszystkie swoje pliki w folderze 'public' , na przykład:

/public/docs/my_word_doc.docx

I wtedy zwykły stary link pozwoli użytkownikowi go pobrać:

<a href="public/docs/my_word_doc.docx">My Word Doc</a>
 10
Author: jordanb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-24 16:47:53

W Expressie 4.x, istnieje attachment() Metoda Response:

res.attachment();
// Content-Disposition: attachment

res.attachment('path/to/logo.png');
// Content-Disposition: attachment; filename="logo.png"
// Content-Type: image/png
 9
Author: Benoit Blanchon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-24 10:15:58
'use strict';

var express = require('express');
var fs = require('fs');
var compress = require('compression');
var bodyParser = require('body-parser');

var app = express();
app.set('port', 9999);
app.use(bodyParser.json({ limit: '1mb' }));
app.use(compress());

app.use(function (req, res, next) {
    req.setTimeout(3600000)
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept,' + Object.keys(req.headers).join());

    if (req.method === 'OPTIONS') {
        res.write(':)');
        res.end();
    } else next();
});

function readApp(req,res) {
  var file = req.originalUrl == "/read-android" ? "Android.apk" : "Ios.ipa",
      filePath = "/home/sony/Documents/docs/";
  fs.exists(filePath, function(exists){
      if (exists) {     
        res.writeHead(200, {
          "Content-Type": "application/octet-stream",
          "Content-Disposition" : "attachment; filename=" + file});
        fs.createReadStream(filePath + file).pipe(res);
      } else {
        res.writeHead(400, {"Content-Type": "text/plain"});
        res.end("ERROR File does NOT Exists.ipa");
      }
    });  
}

app.get('/read-android', function(req, res) {
    var u = {"originalUrl":req.originalUrl};
    readApp(u,res) 
});

app.get('/read-ios', function(req, res) {
    var u = {"originalUrl":req.originalUrl};
    readApp(u,res) 
});

var server = app.listen(app.get('port'), function() {
    console.log('Express server listening on port ' + server.address().port);
});
 4
Author: KARTHIKEYAN.A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-14 18:47:27

Oto Jak to robię:

  1. Utwórz plik
  2. Wyślij plik do klienta
  3. Usuń plik

Kod:

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!');
      });
    });
  });
};
 -1
Author: Vedran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-25 20:14:03