2011-10-04 85 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也沒有解決問題。 –