NodeJs:二进制 fs.createReadStream 作为 UTF-8 流式传输

Dan*_*iel 8 stream utf-8 node.js

我手头的任务是在 NodeJs 中读取 jpeg 文件并将其作为 http-response 发送以回答服务器请求。似乎是微不足道的。但是,我的第一个解决方案失败了。浏览器确实收到了一些二进制乱码,比原始文件大了大约 30%。

我的代码是(简化; res 是 SeverResponse 类型):

...
var fs = require('fs');
var stream = fs.createReadStream(pathToJPEG, {encoding: 'binary'});
res.setHeader('Content-Type', "image/jpeg");
stream.pipe(res);
...
Run Code Online (Sandbox Code Playgroud)

事实证明,到达浏览器的是我的源数据的 UTF-8 编码版本。我还能够排除响应对象是罪魁祸首。当我给它一个替代流(来自缓冲区,而不是文件)时,它工作得很好。

原来我的问题的解决方案是删除选项 {encoding: 'binary'}。我的浏览器收到了正确的图片:

...
var fs = require('fs');
var stream = fs.createReadStream(pathToJPEG);
res.setHeader('Content-Type', "image/jpeg");
stream.pipe(res);
...
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么?

第一个非工作版本应该是正确的似乎很直观,因为它明确声明了如何读取文件。

lxe*_*lxe 5

这是因为binary编码不是真正的binary。使用Buffer 接受的createReadStream相同参数。encoding来自节点缓冲区文档

'binary' - 将缓冲区编码为单字节(即 latin-1)编码字符串的一种方法。不支持字符串“latin-1”。相反,只需传递“binary”即可使用“latin-1”编码。

只需将编码设置为null即可获取原始流或缓冲区,或者根本不指定任何内容,就像您在第二个示例中所做的那样。