【问题标题】:how to send readstream as response如何发送 readstream 作为响应
【发布时间】:2018-11-30 06:47:03
【问题描述】:

当我尝试发送读取流作为响应时出现错误

    var http = require('http'),
        fileSystem = require('fs'),
        path = require('path');

    http.createServer(function(request, response) {
        var filePath = path.join(__dirname, 'myfile.mp3');
        var stat = fileSystem.statSync(filePath);

        response.writeHead(200, {
            'Content-Type': 'audio/mpeg',
            'Content-Length': stat.size
        });

        var readStream = fileSystem.createReadStream(filePath);

response.send(readStream)
    })
    .listen(2000);

我想作为 response.send(readStream) 而不是作为 readStream.pipe(response) 发送; 有没有可能这样发送?

【问题讨论】:

  • 使用.pipe()有什么问题?

标签: node.js http httprequest httpresponse filestream


【解决方案1】:

node 中的 HTTP 响应对象(上面代码中的response)是一个可写流。这意味着如果我们有一个表示myfile.mp3 内容的可读流,您可以将文件的内容通过管道传输到响应对象中。这看起来像这样:

readStream.pipe(response)

这可以防止文件(即myfile.mp3)在作为响应发送之前完全加载到内存中,并且是建议的这样做方法,以防止服务器端出现高内存压力。

有没有可能不使用pipe()发送文件?

实际上有一种方法允许在不使用pipe() 的情况下发送文件,但不鼓励这种方法,因为它首先将整个文件加载到内存中,然后将文件写入响应对象。无论如何,这里有一个关于如何做到这一点的例子:

http.createServer(function(request, response) {
    var filePath = path.join(__dirname, 'myfile.mp3');
    var stat = fileSystem.statSync(filePath);

    response.writeHead(200, {
        'Content-Type': 'audio/mpeg',
        'Content-Length': stat.size
    });

    fs.readFile(filePath, (err, data) => {
      if (err) throw err;
      response.end(data);
    });
}).listen(2000);

【讨论】:

  • 您也可以使用.on('data', ...).on('end', ...) 进行流式传输而不使用.pipe()(尽管我不明白这样做的意义)。
【解决方案2】:

如果这是你真正想要的,那么你可以这样做:

var http = require('http'),
    fileSystem = require('fs'),
    path = require('path');

http.createServer(function(request, response) {
    var filePath = path.join(__dirname, 'myfile.mp3');
    var readStream = fileSystem.createReadStream(filePath);
    readStream.on('data', (data) => {
        response.writeHead(200, { 'Content-Type': 'audio/mpeg' });
        // response.write(Buffer.from(data));
        // response.end();
        response.end(Buffer.from(data));
    });
})
.listen(2000);

否则读取Stream.pipe(response):

http.createServer(function(request, response) {
    var filePath = path.join(__dirname, 'myfile.mp3');
    var readStream = fileSystem.createReadStream(filePath);
    readStream.on('open', () => response.setHeader('Content-Type', 'audio/mpeg'));
    readStream.pipe(response);
})
.listen(2000);

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2021-01-04
    • 2020-04-16
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多