[Node] [Angular]如何下载节点生成的excel文件

时间:2015-12-10 11:33:53

标签: angularjs node.js excel azure

我目前正在节点中构建一个带角度前端的Web应用程序。我想添加一个选项,客户端可以下载生成的excel文件。目前我有一些工作代码可以生成多个excel文件,这些文件当前存储在服务器上的地图中。我想要的是用户现在可以下载这些文件,下载后,文件将被删除。我不知道这是什么最佳做法。以下是我一直在考虑的一些选项:

  • 我将在Azure上部署该应用程序,并能够在Azure上存储为Blob。因此我可以提供一个直接从azure blob下载的网址
  • 也许我可以将数据发送回json并让angular生成excel文件?
  • 或者我可以让它在is并让节点处理下载?
  • 还是其他什么?

有关我可以做什么以及如何实施的建议?

编辑:我正在使用节点包'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');
      })

2 个答案:

答案 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);