Node.js使用二进制文件将http.ClientRequestpipe道传输到fs.createWriteStream会导致损坏的/臃肿的文件
我正在处理一个Node.js(v0.4.12)模块,我有一个奇怪的问题。 这是一个CouchDB模块,虽然我非常确定CouchDB在这里不是问题,但我会把它包含进来,因为它可能是有用的信息。
无论如何,我正在编写一个包装器,用于上传和下载附件与CouchDB。 我有上传部分工作得很好,这是我有困难的下载部分。
我的testing过程是这样的:
- 上传图片文件(
http.request
,fs.createReadStream
) - 下载文件(
http.request
) - 将下载的文件保存到不同的位置进行比较/损坏检查(
fs.createWriteStream
,stream.pipe
)
这对于纯文本文件工作正常,但像图像的二进制文件行为不同。
正如我之前提到的,上传显示正常。 我可以访问CouchDB中的URL并查看图像。 (大小匹配,它呈现我上传的图像)当我使用我的模块下载文件并保存它,输出文件大于源文件,(50-100%大),它不能打开任何图像编辑。 (因此,它以某种方式被“损坏”)
当涉及到二进制文件时,我是否错过了Streams? 我已经尝试将encoding
双方都改为"binary"
和"base64"
,但输出文件仍然比源文件大50%。 在我发现编码选项之前,它被设置为"utf8"
,并且输出文件大了100%,这使我认为这是一个编码问题。
我也尝试手动pipe道stream(而不是使用pipe
方法本身),但结果是相同的。
对不起,如果我得到这个问题错了,但似乎你正在尝试使用二进制文件的编码。 您不需要:默认情况下,节点为您提供二进制数据的原始缓冲区。
下面是我下载一个小丑的例子:
var http = require("http"), fs = require("fs"); http.get({ host: "2.bp.blogspot.com", path: "/_IR8qT_UKjOI/TT2P3qleU9I/AAAAAAAAA3I/beckWSLh3nk/s1600/clown.jpg" }, function(res) { var stream = fs.createWriteStream("clown.jpg"); res.pipe(stream); });
我希望这有帮助。
检查: https : //github.com/joyent/node/issues/1569
节点不喜欢http中的换行符。 更新你的节点。
如果你正在寻找couchdb,我的博客上有关于这个主题的博客文章writings.nunojob.com。 使用nano通常是一个很好的select作为沙发客户端