我目前正在节点中构建一个带角度前端的Web应用程序。我想添加一个选项,客户端可以下载生成的excel文件。目前我有一些工作代码可以生成多个excel文件,这些文件当前存储在服务器上的地图中。我想要的是用户现在可以下载这些文件,下载后,文件将被删除。我不知道这是什么最佳做法。以下是我一直在考虑的一些选项:
有关我可以做什么以及如何实施的建议?
编辑:我正在使用节点包'exceljs'
生成excel文件提前致谢!
编辑:感谢给定的答案和更多的谷歌搜索,我找到了我正在寻找的答案。我稍微修改了它,因为我现在发送一个zip文件,但它也可以使用excel文件。
用于在节点中发送zip文件:
var archive = archiver.create('zip', {});
archive.pipe(res);
archive.directory(dateDir, name).finalize();
用于在节点中发送excel文件:
res.setHeader('Content-Type', 'application/vnd.ms-excel');
res.setHeader('Content-disposition', 'attachment; filename=test.xlsx');
workbook.xlsx.write(res).then(function () {
res.end();
});
对于以角度接收文件我使用FileSaver.js如下:
$http({
url: url,
method: 'POST',
headers: headers,
data: data,
responseType: 'arraybuffer'
})
.success(function (data, status, headers) {
/*var fileName = headers('Content-Disposition');
console.log(fileName);*/
saveAs(new Blob([data], {type: contentType}), 'download.zip');
})
答案 0 :(得分:1)
所以你真正想要的是用户点击文件生成的按钮(excel文件),然后下载并且它不会留在服务器中(纯粹因为它不能用于任何其他目的) )
var path = require('path');
var mime = require('mime');
// write to a file
var workbook = createAndFillWorkbook();
workbook.xlsx.writeFile(filename)
.then(function() {
var file = __dirname + '/upload-folder/<yourfilename>.xlsx';
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);
filestream.on('close', function (error) {
if (err) return res.send(500);
fs.unlink(__dirname + '/upload-folder/<yourfilename>.xlsx');
});
});
在创建文件之后,我们将响应输出给用户,当流关闭时我们正在删除文件,我只是写了伪代码
答案 1 :(得分:1)
根据@Brij Raj Singh - MSFT的解决方案,我认为你可以在AngularJS的各个网址的两个步骤中实现它。
第一步:AngularJS向URL A发送一个http请求,用于生成它呈现数据以生成文件,并返回包含生成的文件名的JSON数据包括URL B以供下载。
// write to a file
var workbook = createAndFillWorkbook();
var filename = '<yourfilename>';
// response a url with file name generated
res.write('{"download_url": "/download/"+filename, "name": "XXX"}');
AngularJS将收到的JSON数据呈现给链接标记<a href="/download/xxx.xlsx">XXX</a>
。
第二步:用户点击下载链接,服务器发回文件响应,然后在下载后删除文件。
var file = __dirname + '/upload-folder/<yourfilename extracted from url>.xlsx';
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);
filestream.on('close', function (error) {
if (err) return res.send(500);
fs.unlink(__dirname + '/upload-folder/<yourfilename>.xlsx');
});
fs.unlink(file);