1
我創建一個流式傳輸模塊,將我的服務器上的流任何文件到用戶node.js的流首標範圍是不確定的
爲了這個,我有以下節點代碼:
.get(function (req, res) {
if (req.query.resourceToken) {
var decoded = jwt.decode(req.query.resourceToken, require('../secret')());
var mediaObject = decoded.mediaObject;
var file = path.resolve(mediaObject.targetDir, mediaObject.file.originalname);
fs.stat(file, function (err, stats) {
if (err) {
if (err.code === 'ENOENT') {
// 404 Error if file not found
return res.sendStatus(404);
}
res.end(err);
}
var range = req.headers.range;
if (!range) {
// 416 Wrong range
return res.sendStatus(416);
}
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, {
"Content-Range": "bytes " + start + "-" + end + "/" + total,
"Accept-Ranges": "bytes",
"Content-Length": chunksize,
"Content-Type": mediaObject.file.mimetype
});
var stream = fs.createReadStream(file, {start: start, end: end})
.on("open", function() {
stream.pipe(res);
}).on("error", function (err) {
res.end(err);
});
});
}
else {
res.status(500).send('Missing resource token!');
}
});
現在下載一個簡單的文件,我有後續的HTML標記:
<a target="_self" href="http://localhost:433/resource?resourceToken=token" class="btn btn-default"> <i class="fa fa-download"> </i></a>
現在,當我按下按鈕,它正確地調用該方法但是header
range
未定義。
這意味着它發送錯誤代碼416
(如上面的代碼所示)。
有誰能告訴我爲什麼會發生這種情況,什麼即時消失?
範圍標題僅在客戶端發送時纔可用,大多數情況下是在流式傳輸文件(視頻/音頻播放器)時使用。下載它時不會。除非它試圖恢復。 –