2013-07-28 135 views
1

我正在使用Node讀取文件並試圖將其作爲多部分MIME文章發送,但遇到文件在接收端出現損壞問題。Node.js緩衝區和二進制文件

我讀文件和發送像這樣準備吧:

fs.readFile("before.png", function(err,data) { 
    // Snip 
    content += data.slice(0,data.length); 

的問題是,有些事情似乎填充流。請參閱下面的圖像,比較在目標處收到的untilpng源文件和文件。 EF BF BD的序列表明.slice()沒有給我底層字節,可能是強制使用UTF-8編碼的東西。

enter image description here

我還試圖通過獲得的toString字節(),但沒有豆子那裏。我仍然在上傳的文件中看到損壞。

// content += data.toString() // UTF-8 default 
content += data.toString('binary') 

我懷疑默認的toString()也被強迫的二進制文件,以UTF-8也是如此,但本來預計「二進制」給我底層的字節流?


編輯迴應布拉德。我嘗試concattin'g,但我仍然需要將我的對象轉換回字符串,此時UTF-8字符似乎重新出現在流中。

contentToSend = Buffer.concat([ header, data, footer ]); 
this.oauth.post(endpoint, accessToken, accessTokenSecret, contentToSend.toString(), contentType, function(x, y, z) { 

回答

3

我認爲正在發生的事情是,你實際上是使用一個連接符,迫使Node.js的治療contentdata與UTF-8的默認編碼字符串。試試這個:

content = Buffer.concat(content, data); 

此外,沒有理由得到一個全面的數據片。您可以按原樣使用整個傳入緩衝區。

+0

非常感謝您的創意建議。在某些時候,我確實需要將它轉換回一個String來發送到我的HTTP帖子中。即使在concatt'ing和toString()整個事情後,我看到了同樣的腐敗。將我現在使用的代碼附加到上面的帖子中,以便我可以格式化它。 –

+0

TBC - 我不知道我是否患有這個人一樣 - http://stackoverflow.com/questions/14855015/getting-binary-content-in-node-js-using-request –

+0

@BenjaminWootton,你的問題然後與你的緩衝區無關,但與源數據編碼。使用任何文件的編碼,你的問題應該消失。如果你想要什麼東西出來,那麼你將不得不把文件視爲二進制文件。不過你可以先嚐試一下這個人的'none'編碼。 – Brad

相關問題