我正在创建一个流式传输模块,将我服务器上的任何文件流式传输给用户
为此我有以下节点代码:
.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
(如上面的代码所示)。
谁能告诉我为什么会发生这种情况以及我缺少什么?
答案 0 :(得分:1)
范围请求具有相当特定的用途(例如在音频/视频清理期间启用部分下载)。
您的HTML建议您只想呈现特定资源的下载链接,并且浏览器不会为此发出范围请求(或可能,但仅限于初始请求)。
因此,您的代码应该允许Range
标头不存在。