我对meteor保存静态文件(/ public文件夹中的文件)的位置感到有点困惑;
我有一种上传文件的方法:
saveFile: function(blob, name, path, encoding) {
if (!Meteor.isServer) return;
var fs = Npm.require('fs'),
chroot = Meteor.chroot || 'public';
//path = cleanPath(path);
name = cleanName(name || 'file');
encoding = encoding || 'binary';
path = chroot + (path ? '/' + path + '/' : '/');
var basePath = process.env.PWD;
var fullPath = basePath + '/' + path + name;
var dirs = (path.split('/'));
var currentCreatedPath = basePath;
//create needed folders
dirs.forEach(function(dir, index) {
if (dir.length > 0) {
currentCreatedPath = currentCreatedPath + '/' + dir;
if (!fs.existsSync(currentCreatedPath)){
fs.mkdirSync(currentCreatedPath);
}
}
});
fs.writeFile(fullPath, blob, encoding, function(err) {
if (err) console.log(err); //throw (new Meteor.Error(500, 'Failed to save file.', err));
else console.log('The file ' + fullPath + 'has been saved');
});
function cleanPath(str) {
if (str) return str.replace(/\.\./g,'').replace(/\/+/g,'').replace(/^\/+/,'').replace(/\/+$/,'');
}
function cleanName(str) {
return str.replace(/\.\./g,'').replace(/\//g,'');
}
return true;
}
然后在模板中我到达这样的文件:
{{#each this.files}}
<li>
<a href="/{{path}}" target="_blank">
{{title}}
</a>
</li>
{{/each}}
其中path是/public/folder/to/file/file.ext
这在当地很有效;但一旦部署,它就无法找到上传的文件; 部署项目的哪个文件夹在meteor中保存文件?
答案 0 :(得分:1)
不建议使用此做法。如果您部署了自己的应用并拥有多个实例或“无人机”运行每一个都无法看到彼此的文件。
最好使用s3之类的东西将文件存储在第三方服务器上。
无论如何如果您决定将文件存储在同一台机器上,您只需要在流星项目之外使用绝对路径。
如果您使用公共文件夹Meteor将因文件更改而重新启动。如果您使用捆绑的asset
静态文件夹,则在查找文件时会遇到一些麻烦。
这样的事情可能有所帮助(保存在桌面上):
var path = Npm.require("path").resolve("~/Desktop/");
saveFile(blob, name, path, encoding)
要查看文件,您可以使用某种代理(如果使用铁路由器):
服务器端代码(可能需要一些调整):
Router.route('/file/:filename', function() {
var self = this;
var res = this.response;
var filename = this.params.filename
var path = Npm.require("path");
var fs = Npm.require("fs");
fs.readFile(path.join(path.resolve("~/Desktop"), filename), function(err, fileContent) {
if(err) console.log(err);
self.response.statusCode = 200;
//self.response.setHeader("Content-Type", response.headers['content-type']);
self.response.setHeader("Content-disposition", filename);
self.response.end(fileContent);
});
}, { where: 'server' });
为简单起见,我使用了您的Desktop
文件夹(OS X)。我建议使用另一个更安全的文件夹。
然后您可以使用网址http://localhost:3000/file/your_file_name下载它。