允许用户从公共文件夹Meteor.js下载文件

时间:2016-10-02 02:31:53

标签: node.js meteor fs exceljs

我正在生成.xlsx文件,然后将其放入"../web.browser/app/cheques.xlsx"。据我所知,它相当于构建中的公共文件夹。问题是我无法设法让它可供下载。

这是服务器方法中的代码片段,我将文件放入该位置:

workbook.xlsx.writeFile("../web.browser/app/cheques.xlsx")
  .then(function() {
    console.log('done');
  });

我应该使用fsPicker.route来完成这项工作吗?

2 个答案:

答案 0 :(得分:3)

不建议这样做。在生产中,构建目录无论如何都无法使用。

您有几个选择:

  1. 将文件存储在文件系统中的已定义位置(不是 / public)像Apache这样的东西可以从
  2. 服务
  3. 存储 Amazon S3存储桶中的文件,然后让AWS为其提供服务
  4. 将文件存储在Mongo集合中,使用这样的包 https://github.com/vsivsi/meteor-file-collection
  5. 我更喜欢最后一个,因为您的所有数据和文件都在一个地方。

答案 1 :(得分:2)

这是让我非常开心的解决方案。感谢我朋友的提议,我将.xlsx生成代码放在server-side route中:

Excel = require('exceljs');
fs = require('fs');

Picker.route('/export/:_cheques', function(params, req, res, next) {
    let data = Cheques.find(query).map((it) => {
      return {
        cheque_number: it.cheque_number, // & other data
      }
    });

    let workbook = new Excel.Workbook();

    let sheet = workbook.addWorksheet('Cheques', { properties: { tabColor: { argb: 'FFC0000' } } });

    sheet.columns = [
      { header: 'Номер чека', key: 'cheque_number', width: 30 },  // & other columns
    ];


    data.map(function(it) {
      sheet.addRow({
        cheque_number: it.cheque_number,  // & other data
      })
    });

    res.writeHead(200, {
      'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
      'Content-Disposition': headerFilename,
    });

    workbook.xlsx.write(res)
)};

然后我在html内添加了一个链接:

<a href='/export/all' rel='external' download> Export my file </a>

......它完美无缺。 &#34;喜欢魅力&#34;,正如你们想说的那样:)

我希望这会对某人有所帮助。