在已部署的Meteor应用程序中上传文件的位置?

时间:2015-06-02 04:05:15

标签: meteor

我对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中保存文件?

1 个答案:

答案 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下载它。