使用 fs 和管道从服务器流式传输静态文件

一个好的 VOD(视频点播)服务应该从基础开始。假设你的服务器上有一个无法公开访问的目录,但你希望通过某种门户或付费墙允许用户访问你的媒体。

var movie = path.resolve('./public/' + req.params.filename);

        fs.stat(movie, function (err, stats) {

            var range = req.headers.range;

            if (!range) {

                return res.sendStatus(416);

            }

            //Chunk logic here
            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, {

                'Transfer-Encoding': 'chunked',

                "Content-Range": "bytes " + start + "-" + end + "/" + total,

                "Accept-Ranges": "bytes",

                "Content-Length": chunksize,

                "Content-Type": mime.lookup(req.params.filename)

            });

            var stream = fs.createReadStream(movie, { start: start, end: end, autoClose: true })

                .on('end', function () {

                    console.log('Stream Done');

                })

                .on("error", function (err) {

                    res.end(err);

                })

                .pipe(res, { end: true });

        });

上面的代码段是你希望如何将视频流式传输到客户端的基本大纲。块逻辑取决于多种因素,包括网络流量和延迟。平衡卡盘尺寸与数量之间的关系非常重要。

最后,.pipe 调用让 node.js 知道保持与服务器的连接打开并根据需要发送其他块。