我手头的任务是读取nodejs中的jpeg文件,并将其作为http响应发送以响应服务器请求。似乎微不足道。然而,我的第一个解决方案失败了。浏览器确实收到一些二进制Gibrish,比原始文件大30%左右。
我的代码是(简化的;res是severresponse类型的):

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

结果是,浏览器上显示的是我的源数据的utf-8编码版本。我还可以排除响应对象是罪魁祸首。当我给它一个可供选择的流(来自缓冲区,而不是文件)时,它工作得很好。
原来解决我问题的办法是去掉{encoding:'binary'}选项。我的浏览器收到了正确的图片:
...
var fs = require('fs');
var stream = fs.createReadStream(pathToJPEG);
res.setHeader('Content-Type', "image/jpeg");
stream.pipe(res);
...

我的问题是:为什么?
第一个非工作版本应该是正确的,这似乎很直观,因为它显式地声明了如何读取文件。

最佳答案

这是因为binary编码并不是真正的binarycreateReadStream使用缓冲区接受的相同参数。从Node Buffer Docs开始:
“二进制”-一种将缓冲区编码为一个字节(即拉丁语-1)编码字符串的方法。不支持字符串“Latin-1”。相反,只需传递“binary”即可使用“latin-1”编码。
只需将encoding设置为encoding以获取原始流或缓冲区,或者根本不指定任何内容,就像在第二个示例中所做的那样。

07-24 09:51
查看更多