node.js express框架实现文件上传与下载功能实例详解

2020-06-17 05:35:14易采站长站整理

exports.uploadFile = function (req, res) {
messageMng.uploadFile(req, function (err, datas) {
res.json(datas);
});
};
//发布端导出附件
exports.exportFile = function (req, res) {
messageMng.exportFile(req, function (err, datas) {
if (err) {
res.set({
"Content-Disposition": "attachment;filename=" + encodeURI("error.txt")
});
res.write(err.message);
res.end();
} else {
//第一种方式 下载完的zip解压报错
// res.download(datas.path, datas.name + ".zip");
//第二种方式
// var path="D:/maven介绍.ppt";
var f = fs.createReadStream(datas.path);
res.writeHead(200, {
'Content-Type': 'application/force-download',
'Content-Disposition': 'attachment; filename='+ encodeURI(datas.name) + '.zip'
});
f.pipe(res);
}
});
};

这里着重说一下下载zip时使用download下载完的压缩包解压会报错,使用第二种方法完美解决。

然后是service层的代码:


/**
* 发布端上传附件
* @param req
* @param fn
*/
MessageManager.prototype.publishUploadFile = function (req, fn) {
try {
//消息ID
var fileId = req.body.fileId;
var file = req.file;
//文件上传的目录
var uploadFolder = path.join(__dirname, '../../upload/publishUploadFile/' + fileId);
//判断文件夹是否存在 不存在则创建
toolUtil.mkdirSync(uploadFolder);
//将上传的文件从临时目录拷贝到指定的目录下
var fileReadStream = fs.createReadStream(file.path);
var fileWriteStream = fs.createWriteStream(uploadFolder + "/" + file.originalname);
fileReadStream.pipe(fileWriteStream);
fileWriteStream.on('close', function () {
// 删除临时目录下面的文件
toolUtil.emptyDir(file.destination);
});
fn(null, {"data": "", "message": "上传成功", "error_code": 200});
} catch (e) {
fn(e, {"data": "", "message": "上传失败", "error_code": e.message});
}
};
/**
* 下载发布端上传的附件
* @param req
* @param fn
*/
MessageManager.prototype.exportPublishFile = function (req, fn) {
try {
//附件ID
var id = req.query.id;
//附件名称或标题
var name = req.query.name;
if (id && name) {
//名称过长的话,截取前25个字符
if (name.length > 25) {
name = name.substr(0, 24);
}
//将要压缩得文件夹路径
var filePath = path.join(__dirname, '../../upload/publishUploadFile/' + id + '/' + name);
if (!fs.existsSync(filePath)) {
fn(new Error("没有附件!"), null);
} else {