it-swarm.com.de

Laden Sie eine Datei mit Express von NodeJS Server herunter

Wie kann ich eine auf meinem Server befindliche Datei auf meinen Computer herunterladen und auf eine Seite in einem nodeJS-Server zugreifen?

Ich verwende die ExpressJS und habe dies versucht:

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

Ich kann den Dateinamen und den Dateityp (oder die Erweiterung) jedoch nicht abrufen. Kann mir jemand dabei helfen?

Aktualisieren

Express hat einen Helfer um das Leben leichter zu machen.

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

Alte Antwort

Für Ihren Browser ist der Name der Datei lediglich "download", Sie müssen also weitere Informationen angeben, indem Sie einen anderen HTTP-Header verwenden.

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

Sie können auch einen Mime-Typ wie diesen senden:

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

Wenn Sie etwas tieferes wollen, dann gehen Sie.

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

Sie können den Header-Wert auf beliebige Werte setzen. In diesem Fall verwende ich eine Mime-Type-Bibliothek - node-mime , um den Mime-Typ der Datei zu überprüfen.

Beachten Sie auch, dass ich Ihren Code geändert habe, um einen readStream zu verwenden. Dies ist eine viel bessere Vorgehensweise, da die Verwendung einer beliebigen Methode mit 'Sync' im Namen verpönt ist, da der Knoten asynchron sein soll.

453
loganfsmyth

Verwenden Sie res.download()

Es überträgt die Datei unter Pfad als "Anhang". Zum Beispiel:

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);    
});
34
Jossef Harush

Für statische Dateien wie pdfs, Word-Dokumente usw. verwenden Sie einfach die statische Funktion von Express in Ihrer Konfiguration:

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

Und dann legen Sie einfach alle Ihre Dateien in diesen 'öffentlichen' Ordner, zum Beispiel:

/public/docs/my_Word_doc.docx

Ein normaler alter Link ermöglicht es dem Benutzer, ihn herunterzuladen:

<a href="public/docs/my_Word_doc.docx">My Word Doc</a>
12
jordanb

In Express 4.x gibt es eine attachment()-Methode für Response:

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

res.attachment('path/to/logo.png');
// Content-Disposition: attachment; filename="logo.png"
// Content-Type: image/png
10
Benoit Blanchon
'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);
});
6
KARTHIKEYAN.A

So mache ich es:

  1. erstelle Datei
  2. datei an Client senden
  3. datei löschen

Code:

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!');
      });
    });
  });
};
0
Vedran