javascript - node.js 流头范围未定义

标签 javascript node.js

我正在创建一个流模块,它将我的服务器上的任何文件流传输给用户

为此我有以下 Node 代码:

    .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 header 不存在。

关于javascript - node.js 流头范围未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37567519/

相关文章:

node.js - Heroku 上的 Redis 连接错误 : 127. 0.0.1 而不是 REDIS_URL

javascript - angular 8 - 组件未加载到 html 中

JavaScript 在提交 HTML 表单时显示新页面

javascript - Bootstrap 将元素一个接一个地放置

node.js - Node js 应用程序中数据库连接池处理的最佳实践?

node.js - 无法安装 PhantomJS 以在 Node.js 中使用

javascript - 原子编辑器 : node-gyp rebuild crashes

javascript - 使用 Object.Keys 迭代值

javascript - 转换回 PHP 中 js getTime() 转换的时间

node.js - 将流从 Fluent-ffmpeg 传递到 Google Cloud Storage