如何用Node.js保存图像(以base64编码的stringforms传入)

我在我的Meteor应用程序上创build了一个带有Phantom.js的HTML5canvas,我试图将canvas图像保存在磁盘上。

问题:保存的图像文件似乎已损坏(无法在图像查看器中打开)。

我从HTML5的Canvas.toDataUrl方法得到了一个base64编码的PNG图像。 这是我从Canvas.toDataUrl()函数保存的输出如下所示:WzMyLDMyLDU4LDQ3LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSw0NywxMTksMTAxLDk4LDExMiw5NywxMDMsMTAxLDQ2LDEwNiwxMTUsNTgsNTAsNTYsNDksMTBd

这是我的保存程序:

var buffer = new Buffer(JSON.stringify(CanvasString)).toString('base64'); var fs = Meteor.npmRequire("fs"); var fullFileName = fileName + '.png'; fs.writeFileSync(fullFileName, buffer, "binary"); 

我可以使用文本编辑器(如上面的输出)将保存的图像作为明文进行查看。

试试这些步骤:

 // our data URL string from canvas.toDataUrl(); var imageDataUrl = "data:image/png;base64,[...]"; // declare a regexp to match the non base64 first characters var dataUrlRegExp = /^data:image\/\w+;base64,/; // remove the "header" of the data URL via the regexp var base64Data = imageDataUrl.replace(dataUrlRegExp, ""); // declare a binary buffer to hold decoded base64 data var imageBuffer = new Buffer(base64Data, "base64"); // write the buffer to the local file system synchronously fsWriteFileSync("/tmp/test.png", imageBuffer); 
  • 注意:您可能不希望使用fs.writeFileSync在Node.JS的磁盘上写入,因为它会阻塞整个Node事件循环。

而是使用Meteor.wrapAsync包装呼叫:

 var fsWriteFileSync = Meteor.wrapAsync(fs.writeFile, fs);