通过createWriteStream将base 64字符串保存到文件中

时间:2013-01-11 03:24:34

标签: node.js

我有一个图像通过电子邮件(通过云服务提供商Mandrill)进入我的Node.js应用程序。该图像以base64编码的字符串形式出现,在下面的示例中为email.content。我正在将图像写入缓冲区,然后是这样的文件:

//create buffer and write to file
var dataBuffer = new Buffer(email.content, 'base64');                        
var writeStream = fs.createWriteStream(tmpFileName);

writeStream.once('open', function(fd) {
    console.log('Our steam is open, lets write to it');
    writeStream.write(dataBuffer);
    writeStream.end();
}); //writeSteam.once('open')

writeStream.on('close', function() {
    fileStats = fs.statSync(tmpFileName);

这个工作正常并且一切都很好,但我基本上将这部分代码的内存需求加倍,因为我将我的图像存储在内存中(作为原始字符串),然后创建一个相同字符串的缓冲区在写文件之前?我将要处理大量的入站图像,因此需要将内存需求加倍。

我尝试了几种方法将email.content直接写入流,但它总是生成一个无效的文件。我是现代编码的业余爱好者,所以你很高兴告诉我这个问题完全没有根据,只要你告诉我为什么光线会在大理石头上曙光。

谢谢!

2 个答案:

答案 0 :(得分:2)

由于您已将整个文件存储在内存中,因此创建写入流没有意义。只需使用fs.writeFile

即可
fs.writeFile(tmpFileName, email.content, 'base64', callback)

答案 1 :(得分:1)

@ Jonathan的答案是缩短已有代码的更好方法,所以一定要这样做。

我会扩展你关于记忆的问题。事实上,Node不会先将任何内容写入文件而不将其转换为Buffer,因此,当您告诉我们有关email.content的内容时,您无法做到这一点。

如果您真的对此感到担心,那么您需要一些方法来处理email.content的值,因为它来自您从哪里获取它作为流。然后,当数据流入服务器时,您立即将其写入文件,因此不会占用超过所需的RAM。

如果您详细说明,我可以尝试填写更多信息。