当直接访问的某个文件时,如果该文件是二进制等浏览器无法解析的文件,浏览器才会下载该文件,但如果浏览器可以自己解析该文件,则它会打开该文件并以自己的方式呈现出来,而不会下载,此时就需要设置消息响应头,告诉浏览器该文件需要下载而不是简单的打开。
实现方法如下,访问:http://localhost:3000/download?fileType=1&fileName=test.txt (fileType的值为1、2、3)
说明:下载文件必须放在public目录下
在app.js文件中加入以下代码
app.use('/download', index);
index.js文件
var express = require('express');
var router = express.Router();
var path = require('path');
var fs = require('fs');
/* GET home page. */
router.get('/', function(req, res, next) {
var fileType = req.query.fileType;
var fileName = req.query.fileName;
if (fileType == 1) {
//直接访问文件进行下载
res.redirect(fileName);
} else if (fileType == 2) {
//以文件流的形式下载文件
var filePath = path.join(__dirname, '../public/' + fileName);
var stats = fs.statSync(filePath);
var isFile = stats.isFile();
if(isFile){
res.set({
'Content-Type': 'application/octet-stream', //告诉浏览器这是一个二进制文件
'Content-Disposition': 'attachment; filename=' + fileName, //告诉浏览器这是一个需要下载的文件
'Content-Length': stats.size //文件大小
});
fs.createReadStream(filePath).pipe(res);
} else {
res.end(404);
}
} else if (fileType == 3) {
//读取文件内容后再响应给页面
var filePath = path.join(__dirname, '../public/' + fileName);
var stats = fs.statSync(filePath);
var isFile = stats.isFile();
if (isFile) {
fs.readFile(filePath, function(isErr, data){
if (isErr) {
res.end("Read file failed!");
return;
}
res.set({
'Content-Type': 'application/octet-stream', //告诉浏览器这是一个二进制文件
'Content-Disposition': 'attachment; filename=' + fileName, //告诉浏览器这是一个需要下载的文件
'Content-Length': stats.size //文件大小
});
res.end(data)
})
} else {
res.end(404);
}
} else {
res.end(404);
}
});
module.exports = router;
完整的上传、下载项目,可在这里下载:nodejs实现简单的上传下载功能