我有一个图像通过电子邮件(通过云服务提供商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直接写入流,但它总是生成一个无效的文件。我是现代编码的业余爱好者,所以你很高兴告诉我这个问题完全没有根据,只要你告诉我为什么光线会在大理石头上曙光。
谢谢!
答案 0 :(得分:2)
由于您已将整个文件存储在内存中,因此创建写入流没有意义。只需使用fs.writeFile
fs.writeFile(tmpFileName, email.content, 'base64', callback)
答案 1 :(得分:1)
@ Jonathan的答案是缩短已有代码的更好方法,所以一定要这样做。
我会扩展你关于记忆的问题。事实上,Node不会先将任何内容写入文件而不将其转换为Buffer
,因此,当您告诉我们有关email.content
的内容时,您无法做到这一点。
如果您真的对此感到担心,那么您需要一些方法来处理email.content
的值,因为它来自您从哪里获取它作为流。然后,当数据流入服务器时,您立即将其写入文件,因此不会占用超过所需的RAM。
如果您详细说明,我可以尝试填写更多信息。