2011-10-04 88 views
6

我在处理Node.js(v0.4.12)模块时遇到了一个奇怪的问题。这是一个CouchDB模块,虽然我非常肯定CouchDB在这里不是问题,但我会将它包含进来,因为它可能是有用的信息。Node.js使用二进制文件将http.ClientRequest管道传输到fs.createWriteStream导致损坏/臃肿的文件

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

我的测试过程是这样的:

  1. 上传图像文件(http.requestfs.createReadStream
  2. 下载文件(http.request
  3. 保存下载文件到不同的位置进行比较/腐败检查(fs.createWriteStreamstream.pipe

这适用于纯文本文件,但是二进制像图片这样的文件行为有所不同。

正如我前面提到的,上传显示正常。正如我可以访问CouchDB中的URL并查看图像。 (大小匹配,它呈现我上传的图像)当我使用我的模块下载文件并保存时,输出文件大于源文件(大50-100%),并且无法通过任何图像打开编辑。 (因此,它在某种程度上“损坏了”)

当我提到二进制文件时,我是否错过了Streams?我试过将两边的encoding更改为"binary""base64",但输出文件仍比源文件大50%。在我发现编码选项之前,它被设置为"utf8",并且输出文件大100%,所以这导致我认为这是一个编码问题。

我也尝试手动管道流(而不是使用pipe方法本身),但结果是相同的。

回答

6

对不起,如果我得到这个问题错了,但似乎你是 试图使用二进制文件编码。您不需要 以:默认情况下,节点为您提供带有二进制数据的原始缓冲区。

这里是我的下载小丑的例子:

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); 
    }); 

我希望这有助于。

+0

啊哈,这个伎俩!太感谢了! –

0

检查: https://github.com/joyent/node/issues/1569

节点不喜欢的HTTP换行。更新你的节点。

如果您正在寻找couchdb,我的博客上有关于这个主题的博客文章writings.nunojob.com。使用纳米通常是一个很好的选择作为沙发客户端

+0

我已经在使用v0.4.12,升级和使用v0.5.8也没有解决问题。 –