2013-07-28 218 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

相关问题