Node.js使用二进制文件将http.ClientRequest连接到fs.createWriteStream会导致文件损坏/膨胀

Dom*_*nes 6 couchdb image node.js

我正在研究一个Node.js(v0.4.12)模块的奇怪问题.这是一个CouchDB模块,虽然我很确定CouchDB不是这里的问题,但我会把它包括在内,因为它可能是有用的信息.

无论如何,我正在编写一个使用CouchDB上传和下载附件的包装器.我上传部分工作得很好,这是我遇到困难的下载部分.

我的测试过程是这样的:

  1. 上传图片文件(http.request,fs.createReadStream)
  2. 下载文件(http.request)
  3. 将下载的文件保存到其他位置以进行比较/损坏检查(fs.createWriteStream,stream.pipe)

这适用于纯文本文件,但像图像这样的二进制文件表现不同.

正如我之前提到的,上传似乎很好.我可以访问CouchDB中的URL并查看图像.(大小匹配,它呈现我上传的图像)当我使用我的模块下载文件并保存它时,输出文件比源文件大(50-100%更大),它不能被任何图像打开编辑.(因此,它以某种方式"腐败")

在二进制文件方面,我是否遗漏了一些关于Streams的内容?我已经尝试将encoding两侧更改为"binary""base64",但输出文件仍然比源大50%.在我发现编码选项之前,它被设置为"utf8",并且输出文件大100%,因此这让我认为这是一个编码问题.

我也试过手动管道流(而不是使用pipe方法本身),但结果是一样的.

meg*_*rre 6

很抱歉,如果我的问题出错,但您似乎正在尝试使用二进制文件进行编码.您不需要:node默认为您提供带二进制数据的原始缓冲区.

这是我下载小丑的一个例子:

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);
  });
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.