Node.js 通过createWriteStream将base 64字符串保存到文件

Node.js 通过createWriteStream将base 64字符串保存到文件,node.js,Node.js,我通过电子邮件(通过云服务提供商Mandrill)将一个图像发送到Node.js应用程序中。图像以base64编码字符串的形式出现,在下面的示例中为email.content。我目前正在将图像写入缓冲区,然后写入如下文件: //create buffer and write to file var dataBuffer = new Buffer(email.content, 'base64'); var writeStream = fs.creat

我通过电子邮件(通过云服务提供商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直接写入流,但它总是生成一个无效文件。我是一个精通现代编码的业余爱好者,所以欢迎你告诉我,这种担心完全没有根据,只要你告诉我为什么大理石头上会有亮光


谢谢

因为您的内存中已经有了整个文件,所以没有必要创建写入流。只需使用
fs.writeFile

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

因为您已经在内存中保存了整个文件,所以创建写流是没有意义的。只需使用
fs.writeFile

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

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

不过,我会详细谈谈你关于记忆的问题。事实上,如果不先将文件转换为
缓冲区,Node将不会向文件写入任何内容,因此当您告诉我们有关
email.content
的信息时,您就无能为力了

如果你真的担心这一点,那么你需要一些方法来处理
email.content
的价值,因为它来自于你从哪里获得它,作为一个流。然后,当数据流传输到服务器时,您会立即将其写入一个文件,从而不会占用超过需要的RAM


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

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

不过,我会详细谈谈你关于记忆的问题。事实上,如果不先将文件转换为
缓冲区,Node将不会向文件写入任何内容,因此当您告诉我们有关
email.content
的信息时,您就无能为力了

如果你真的担心这一点,那么你需要一些方法来处理
email.content
的价值,因为它来自于你从哪里获得它,作为一个流。然后,当数据流传输到服务器时,您会立即将其写入一个文件,从而不会占用超过需要的RAM


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

我认为这可能是最终的方向,正如我所看到的流式读取示例。我的“问题”是这是来自Mandrill的,我只是使用express的forms功能从Mandrill获取JSON。我可以想象,我需要写一个使用流的请求处理程序,这可能比我现在想做的要多。谢谢你增加了我的知识!!!我认为这可能是最终的方向,正如我所看到的流式读取示例。我的“问题”是这是来自Mandrill的,我只是使用express的forms功能从Mandrill获取JSON。我可以想象,我需要写一个使用流的请求处理程序,这可能比我现在想做的要多。谢谢你增加了我的知识!!!我试过了,没有先将email.content复制到缓冲区,就得到了一个损坏的文件。知道为什么会这样吗?我希望避免中间缓冲区步骤,但这似乎是成功获取有效映像的唯一方法。我尝试过这个方法,但我没有先将email.content复制到缓冲区,就得到了一个损坏的文件。知道为什么会这样吗?我希望避免中间缓冲步骤,但这似乎是成功获取有效映像的唯一方法。