0

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

谢谢!

4

2 回答 2

2

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

fs.writeFile(tmpFileName, email.content, 'base64', callback)
于 2013-01-11T04:35:31.920 回答
1

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

不过,我将扩展您有关记忆的问题。事实是 Node 不会在不将文件转换为Buffer第一个文件的情况下将任何内容写入文件,因此当您告诉我们关于的内容时email.content,您无能为力。

但是,如果您真的对此感到担心,那么您将需要某种方法来处理email.content从您获取它的任何地方传入的值,作为一个流。然后,当数据流式传输到服务器时,您会立即将其写入文件,因此不会占用比需要更多的 RAM。

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

于 2013-01-11T04:57:55.497 回答