2013-01-11 79 views
0

我有一張圖像通過電子郵件(通過雲服務提供者Mandrill)進入我的Node.js應用程序。該圖像以base64編碼字符串形式出現,在下面的示例中爲email.content。我目前正在寫的圖像緩衝區,然後一個文件是這樣的:通過createWriteStream將基本64字符串保存到文件

//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

由於您已將整個文件存儲在內存中,因此創建寫入流沒有意義。只需使用fs.writeFile

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

我試過這個,我沒有先複製email.content到一個緩衝區,我得到一個損壞的文件。任何想法爲什麼發生這種情況我想避免中間緩衝步驟,但這似乎是成功獲取有效圖像的唯一方法。 – pat

1

@喬納森的回答是一個更好的方式來縮短你已經擁有的代碼,所以肯定做。

我會擴展你關於記憶的問題。事實是,Node不會將任何內容寫入文件,而無需先將其轉換爲Buffer,因此當您告訴我們關於email.content的信息時,您無能爲力。

如果你真的擔心這個問題,那麼你需要一些方法來處理email.content的價值,因爲它來自你從哪裏得到它,作爲一個流。然後,隨着數據流入服務器,您立即將其寫入文件,因此不會佔用超過所需的RAM。

如果您詳細說明,我可以嘗試填寫更多信息。

+0

我在想這可能是最終的方向,因爲我已經看到了流式讀取的例子。我的「問題」是,這是來自Mandrill,我只是使用Express表單功能從Mandrill獲取JSON。我想我會需要更多的時間和精力去寫一個使用流的請求處理程序,這可能比我現在想要咬的更多。感謝您加入我的知識! – pat

相關問題