如何将服务器中的文件下载到访问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();
});
但是我无法获得文件名和文件类型(或扩展名)。有人能帮我一下吗?
你可以使用res.sendFile()…Sample-download.xlsx应该和这个函数在同一个目录下。
const downloadFile = (req,res) => {
var options = {
root: path.join(__dirname),
};
let fileName = "Sample-download.xlsx";
res.sendFile(fileName, options, function (err) {
if (err) {
console.log(err);
return res.status(500).json({ success: false, message: "internal server error. please try again later" });
} else {
console.log("Sent:", fileName, "at", new Date().toString());
}
});
}
更新
Express有一个助手,可以让生活更轻松。
app.get('/download', function(req, res){
const file = `${__dirname}/upload-folder/dramaticpenguin.MOV`;
res.download(file); // Set disposition and send it.
});
旧的答案
就你的浏览器而言,文件的名称只是“下载”,所以你需要通过使用另一个HTTP头来给它更多的信息。
res.setHeader('Content-disposition', 'attachment; filename=dramaticpenguin.MOV');
你可能还想发送一个mime类型,比如:
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);
});
您可以将标题值设置为您喜欢的任何值。在本例中,我使用mime类型库- node-mime来检查文件的mime类型。
这里需要注意的另一件重要的事情是,我更改了您的代码以使用readStream。这是一种更好的方式,因为使用任何名称中带有“Sync”的方法都是不受欢迎的,因为节点意味着异步。
对于静态文件,如pdf, Word文档等,只需在配置中使用Express的静态函数:
// Express config
var app = express().configure(function () {
this.use('/public', express.static('public')); // <-- This right here
});
然后把你所有的文件放到public文件夹里,例如:
/public/docs/my_word_doc.docx
然后一个常规的旧链接将允许用户下载它:
<a href="public/docs/my_word_doc.docx">My Word Doc</a>
我是这样做的:
创建文件
发送文件到客户端
删除文件
代码:
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!');
});
});
});
};