javascript - 使用 Meteor 生成和提供静态文件

标签 javascript express meteor

我希望根据提供的对象的内容创建静态文本文件,然后用户可以下载该文件。这是我计划做的事情:

  1. 当用户点击“导出”时,应用程序会调用 Meteor.method(),后者会使用典型的 Node 方法解析文件并将其写入公共(public)目录。

  2. 创建文件后,在 Meteor.method() 的回调中,我会提供指向生成文件的链接。例如,“public/userId/file.txt”。然后,用户可以选择通过该链接下载文件。

  3. 然后,我使用 Meteor 的 Connect modele(它在内部使用)将任何对上述 URL 的请求路由到文件本身。我可以根据 userId 和用户的登录状态进行一些权限检查。

问题:当公开生成静态文件时,网页每次都会自动重新加载。我认为使用 Express 之类的东西来生成 REST 端点可能更有意义,它可以处理创建文件的问题。但如果我无权访问 Meteor session 数据,我不确定如何处理权限。

关于这里的最佳策略有什么想法吗?

最佳答案

在版本 0.6.6.3 0.7.x - 1.3.x 中,您可以执行以下操作:

var fs = Npm.require('fs');
var filePath = process.env.PWD + '/.uploads_dir_on_server/' + fileName;
fs.writeFileSync(filePath, data, 'binary');

服务

在普通 meteor 应用程序中

var fs = Npm.require('fs');
WebApp.connectHandlers.use(function(req, res, next) {
    var re = /^\/uploads_url_prefix\/(.*)$/.exec(req.url);
    if (re !== null) {   // Only handle URLs that start with /uploads_url_prefix/*
        var filePath = process.env.PWD + '/.uploads_dir_on_server/' + re[1];
        var data = fs.readFileSync(filePath);
        res.writeHead(200, {
                'Content-Type': 'image'
            });
        res.write(data);
        res.end();
    } else {  // Other urls will have default behaviors
        next();
    }
});

使用iron:router时

这应该是服务器端路由(例如:在 /server/ 文件夹中的文件中定义)

编辑(2016年5月9日)

var fs = Npm.require('fs');
Router.route('uploads', {
       name: 'uploads',
       path: /^\/uploads_url_prefix\/(.*)$/,
       where: 'server',
       action: function() {
           var filePath = process.env.PWD + '/.uploads_dir_on_server/' + this.params[0];
           var data = fs.readFileSync(filePath);
           this.response.writeHead(200, {
               'Content-Type': 'image'
           });
           this.response.write(data);
           this.response.end();
       }
    });

过时的格式:

Router.map(function() {
    this.route('serverFile', {
        ...// same as object above
    }
});

注释

  • process.env.PWD将为您提供项目根目录
  • 如果您打算将文件放入项目中

    • 不要使用publicprivate meteor 文件夹
    • 使用点文件夹(例如隐藏文件夹,例如:.uploads)

    不尊重这两个将导致本地 meteor 在每次上传时重新启动,除非您使用以下命令运行 meteor 应用程序:meteor run --production

  • 我使用此方法进行了简单的图像上传和服务(基于 dario 的版本)
  • 如果您希望进行更复杂的文件管理,请考虑 CollectionFS

关于javascript - 使用 Meteor 生成和提供静态文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13201723/

相关文章:

node.js - 如何使用 Express Swagger Generator 在同一条路线上定义多个操作

javascript - 如何使用 Node 将表单数据(文本/纯文本)转换为json?

javascript - meteor 插件不起作用

javascript - 将外部配置/参数传递给 Meteor *移动* 构建?

javascript - 在对象数组中添加对象(对象是多维的)

javascript - 将 MONGO 中的 JSON 包含到 HTML 中时出现 500 ReferenceError

javascript - Angular : How to restrict user inputs which contain sql query keywords (for sql injection)

Meteor 和 C nopoll 应用程序之间的连接丢失

javascript - 单击页面中任意位置时隐藏菜单

javascript - 使用reduce将源对象的可枚举属性扩展到目标对象