使用 fs 和管道從伺服器流式傳輸靜態檔案
一個好的 VOD(視訊點播)服務應該從基礎開始。假設你的伺服器上有一個無法公開訪問的目錄,但你希望通過某種門戶或付費牆允許使用者訪問你的媒體。
var movie = path.resolve('./public/' + req.params.filename);
fs.stat(movie, function (err, stats) {
var range = req.headers.range;
if (!range) {
return res.sendStatus(416);
}
//Chunk logic here
var positions = range.replace(/bytes=/, "").split("-");
var start = parseInt(positions[0], 10);
var total = stats.size;
var end = positions[1] ? parseInt(positions[1], 10) : total - 1;
var chunksize = (end - start) + 1;
res.writeHead(206, {
'Transfer-Encoding': 'chunked',
"Content-Range": "bytes " + start + "-" + end + "/" + total,
"Accept-Ranges": "bytes",
"Content-Length": chunksize,
"Content-Type": mime.lookup(req.params.filename)
});
var stream = fs.createReadStream(movie, { start: start, end: end, autoClose: true })
.on('end', function () {
console.log('Stream Done');
})
.on("error", function (err) {
res.end(err);
})
.pipe(res, { end: true });
});
上面的程式碼段是你希望如何將視訊流式傳輸到客戶端的基本大綱。塊邏輯取決於多種因素,包括網路流量和延遲。平衡卡盤尺寸與數量之間的關係非常重要。
最後,.pipe 呼叫讓 node.js 知道保持與伺服器的連線開啟並根據需要傳送其他塊。