使用Express从NodeJS Server下载文件

如何将我服务器中的文件下载到我的机器上访问nodeJS服务器中的页面?

我正在使用ExpressJS,我一直在试试这个:

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

但是我不能得到文件名和文件types(或扩展名)。 任何人都可以帮助我吗?

更新

快递有这个帮手 ,使生活更轻松。

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

您可能还想发送一个MIMEtypes如下:

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

您可以将标题值设置为任何你喜欢的。 在这种情况下,我正在使用mimetypes的节点 – mime ,来检查文件的mimetypes是什么。

这里另一个重要的事情是,我已经改变了你的代码使用readStream。 这是一个更好的方法来做事情,因为在名称中使用'Sync'的任何方法都会被忽略,因为节点意味着是asynchronous的。

使用res.download()

它作为一个“附件”在path上传输文件。 例如:

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

对于像PDF,Word文档等静态文件,只需在您的configuration中使用Express的静态function:

 // 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> 

在Express 4.x中,有一个attachment()方法来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); }); 

以下是我如何做到这一点:

  1. 创build文件
  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!'); }); }); }); };