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?
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.
});
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.
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);
});
res.download()
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>
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
'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);
});
So mache ich es:
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!');
});
});
});
};