如何使用铁路由器或流星本身提供文件?
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 或其他类型的交换。以上是关于如何使用铁路由器或流星本身提供文件?的主要内容,如果未能解决你的问题,请参考以下文章