使用express发送修改后的文件

时间:2013-07-13 21:41:29

标签: node.js

我想基于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>)
});

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

我知道这种方法存在安全问题。问题是关于如何使用express和node.js这样做,我肯定会放入大量代码来清理输入。更好的是,从来没有打过shell(很容易使用JS而不是sed进行转换)

2 个答案:

答案 0 :(得分:3)

我相信答案是这样的:

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'
>

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

答案 1 :(得分: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(错误)。

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下载文件。快递有很多东西可以提供,看看文档。