2013-07-13 37 views
2

我想根據URL路由發送文件的修改版本。使用express發送修改後的文件

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來做到這一點,我一定會輸入很多代碼來清理輸入。更重要的是,從不打殼(很容易的用JS,而不是如sed做變換)

回答

1

什麼是你一個正常的文件類型?

設置使用MIME類型(docs):

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這臺基於MIME類型在分機上

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。快遞有更多優惠,看看文件。

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

很一般選項,我會說。蟒蛇可能會欣賞它。

相關問題