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发送错误代码(如上面的代码所示)。

谁能告诉我为什么会发生这种情况以及我错过了什么?

范围请求有一个相当具体的目的(例如在音频/视频清理期间启用部分下载)。

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

因此,您的代码应允许 Range 标头不存在。

最新更新