3

我想提供基于 URL 路由的文件的修改版本。

app.get('/file/:name/file.cfg', function (req, res) {
    res.send(<the file file.cfg piped through some sed command involving req.params.name>)
});

关键是,响应不应该是 type text/html,它应该是与正常相同的 MIME 类型(这可能仍然是错误的,但至少它有效)。

我知道这种方法存在安全问题。问题是关于如何使用 express 和 node.js 执行此操作,我一定会放入大量代码来清理输入。更好的是,永远不要打壳(很容易使用 JS 而不是例如sed进行转换)

4

2 回答 2

4

我相信答案是这样的:

app.get('/file/:name/file.cfg', function (req, res) {
    fs.readFile('../dir/file.cfg', function(err, data) {
        if (err) {
            res.send(404);
        } else {
            res.contentType('text/cfg'); // Or some other more appropriate value
            transform(data); // use imagination please, replace with custom code
            res.send(data)
        }
    });
});

我碰巧正在使用的 cfg 文件是(这是节点 repl 的转储):

> express.static.mime.lookup("../kickstart/ks.cfg")
'application/octet-stream'
>

相当通用的选项,我会说。Anaconda 可能会很感激。

于 2013-07-13T21:59:48.837 回答
1

什么是您的正常文件类型?

使用 ( docs )设置 mimetype :

app.get('/file/:name/file.cfg', function (req, res) {
    res.set('content-type', 'text/plain');
    res.send(<the file file.cfg piped through some sed command involving req.params.name>)
});

如果要检测文件的 mime 类型,请使用node-mime


要从磁盘发送文件,请使用res.sendfile,它根据扩展名设置 mimetype

res.sendfile(路径,[选项],[fn]])

在给定路径传输文件。

根据文件名的扩展名自动默认 Content-Type 响应头字段。传输完成或发生错误时调用回调 fn(err)。

app.get('/file/:name/file.cfg', function (req, res) {
  var path = './storage/' + req.params.name + '.cfg';
  if (!fs.existsSync(path)) res.status(404).send('Not found');
  else res.sendfile(path);
});

您还可以使用res.download强制浏览器下载文件。express 提供更多功能,请查看文档。

于 2013-07-13T21:58:32.880 回答