我正试图在我的Meteor应用程序上提供一个zip文件但是我被卡住了.经过大量的谷歌搜索似乎最好的方法是与铁路由器,但我不知道如何:
Router.map -> @route "data", where: 'server' path: '/data/:id' action: -> data = getBase64ZipData(this.params.id) this.response.writeHead 200, { 'Content-Type': 'application/zip;base64' } ???
David Weldon.. 34
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'});
download zip
关于这一点的好处是它将文件作为附件下载,您可以自定义用户看到的文件名.诀窍在于编写fileFromId
函数.我发现将所有动态生成的文件存储在下面是最容易的/tmp
.
这个答案假定文件是动态生成的.如果要提供静态内容,可以将文件放在public
目录下.有关详细信息,请参阅此问题.
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
目录下.有关详细信息,请参阅此问题.