【问题标题】:Send a huge content range using streams使用流发送大量内容
【发布时间】:2017-06-06 20:05:05
【问题描述】:

如何使用读取流发送部分文件以响应 HTTP 请求?

我想发送一个大文件的任意Content-Range

当我使用fs.createReadStream('hugeFile.bin').pipe(response) 过滤掉一部分可读流时,我无法使用事件。我可以创建一个虚假的可写流,它会省略(如> /dev/null)一部分数据,但chunk 的大小可能不是要发送的第一部分的倍数。

如何解决问题?

【问题讨论】:

    标签: node.js pipe partial httpserver


    【解决方案1】:

    看看https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_createreadstream_path_options

    特别是 startend 选项 - 这些让您可以设置文件中的字节偏移量以开始和停止读取。

    所以基本上你会这样做:

    fs.createReadStream('hugeFile.bin', { start: firstByte, end: lastByte }).pipe(response)
    

    或道德上的等价物,它会做你想做的。

    【讨论】:

    • 如果我先response.statusCode = 216; 然后response.setHeader('Content-Range', 'bytes ' + start + '-' + (end - 1) + '/' + stat.size);,那么我应该怎么做才能通过流发送文件内容?我应该在你写的代码行之后调用response.end();吗?
    • 或者我应该在'end' fs.createReadStream('hugeFile.bin', { start: firstByte, end: lastByte }) 对象的事件处理程序中执行response.end(); 吗?
    • response.end 将在源流结束时自动调用。它应该可以工作。
    • 所以如果我想发送大量文件部分,如果我需要流来解决内存问题是不可能的?
    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 2011-09-27
    • 2013-12-29
    • 2019-08-15
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多