node.jsstream的头部范围是未定义的

我正在创build一个stream模块,将我的服务器上的任何文件stream到用户

为此,我有以下节点代码:

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

现在,当我按下button,它正确地调用方法,但是header range是未定义的。

这意味着它发送错误代码416 (如上面的代码所示)。

谁能告诉我这是为什么发生,什么即时失踪?

范围请求具有相当特定的用途(如在audio/video清理过程中启用部分下载)。

您的HTMLbuild议您只想为特定资源提供一个下载链接,浏览器不会为此发出范围请求( 或者可能,但仅在初始请求之后)。

所以你的代码应该允许Range头不存在。