我想基于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
进行转换)
答案 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根据扩展名
设置mimetyperes.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下载文件。快递有很多东西可以提供,看看文档。