如何使用铁路由器或流星本身提供文件?

Posted

技术标签:

【中文标题】如何使用铁路由器或流星本身提供文件?【英文标题】:How to serve a file using iron router or meteor itself? 【发布时间】:2014-03-01 05:16:02 【问题描述】:

我正在尝试在我的 Meteor 应用程序上提供一个 zip 文件,但我被卡住了。经过大量谷歌搜索后,似乎最好的方法是使用 Iron Router,但我不知道如何:

Router.map ->
  @route "data",
    where: 'server'
    path: '/data/:id'
    action: ->
      data = getBase64ZipData(this.params.id)
      this.response.writeHead 200,  'Content-Type': 'application/zip;base64' 
      ???

【问题讨论】:

是否因为某种原因无法将文件放入public 文件夹? 啊啊啊咖啡脚本!阅读速度不如普通js快 【参考方案1】:

在服务器上:

var fs = Npm.require('fs');

var fail = function(response) 
  response.statusCode = 404;
  response.end();
;

var dataFile = function() 
  // TODO write a function to translate the id into a file path
  var file = fileFromId(this.params.id);

  // Attempt to read the file size
  var stat = null;
  try 
    stat = fs.statSync(file);
   catch (_error) 
    return fail(this.response);
  

  // The hard-coded attachment filename
  var attachmentFilename = 'filename-for-user.zip';

  // Set the headers
  this.response.writeHead(200, 
    'Content-Type': 'application/zip',
    'Content-Disposition': 'attachment; filename=' + attachmentFilename
    'Content-Length': stat.size
  );

  // Pipe the file contents to the response
  fs.createReadStream(file).pipe(this.response);
;

Router.route('/data/:id', dataFile, where: 'server');

在客户端:

<a href='/data/123'>download zip</a>

这样做的好处是它将文件作为附件下载,并且您可以自定义用户看到的文件名。诀窍是编写fileFromId 函数。我发现将所有动态生成的文件存储在/tmp 下是最简单的。

此答案假定文件是动态生成的。如果你想提供静态内容,你可以把你的文件放在public 目录下。有关详细信息,请参阅this 问题。

【讨论】:

如何在服务器路由上验证调用者的身份? 服务器路由将无法通过流星的身份验证机制识别用户。您需要引入 cookie 或其他类型的交换。

以上是关于如何使用铁路由器或流星本身提供文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Iron 路由器提供静态内容(图像、字体等)

铁:路由器不渲染模板

流星中的动态页面渲染

如何将主干视图连接到流星车把模板?

如何延迟铁路由器路由查找

流星 - 如何编写引导模式模板以重新呈现 html 输入值,即使用户已输入它们