如何使用node.js将二进制数据写入文件?

我正在尝试对canvas的toDataUrl() ,它提供了base64数据。 我想把它存储为一个png 。 我可以从base64获得转换后的二进制数据,但是我不能用NodeJs服务把它写到一个文件中。

如果我直接写入base64数据到文件,所有的数据都可以写入,但是不能成为png对吧? 我想存储要存储的二进制数据。 怎么做?

代码片段:

 var strData = this.drawingCanvas.getContext().canvas.toDataURL(); var data = strData.replace(/^data:image\/\w+;base64,/, ""); var imgData = this.decode(data); // decode(data) is DEFINED BELOW this.call({filePath:'<path>/image.png', data: imgData}, {method:"writeFile"});` `utf8decode : function (utftext) { var string = ""; var i = 0; var c = c1 = c2 = 0; while ( i < utftext.length ) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i+1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = utftext.charCodeAt(i+1); c3 = utftext.charCodeAt(i+2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } return string; },` `_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", decode : function (input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = this._keyStr.indexOf(input.charAt(i++)); enc2 = this._keyStr.indexOf(input.charAt(i++)); enc3 = this._keyStr.indexOf(input.charAt(i++)); enc4 = this._keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } output = this.utf8decode(output); return output; },` /************************************************** wRITEfILEaaSSISTANT.JS ***************************************************/ var WriteFileAssistant = function(){}; WriteFileAssistant.prototype.run = function(future, subscription) { var fs = IMPORTS.require('fs'); var filePath = this.controller.args.filePath; var f = subscription.get(); f.result = {reply: data}; var fd = fs.openSync('<path>/image.png', 'a+'); //var data = fs.writeSync(fd, g, null, encoding='utf8'); //this.controller.args.data - Image data (binary) var buff = new Buffer(this.controller.args.data, 'binary'); //tried also with 'base64' fs.write(fd, buff, 0, buff.length, 0, function(err,written){ }); var f = subscription.get(); f.result = {reply: data}; 

你正在做的事情比他们需要的更难。 节点缓冲区对象以base64作为input,并为您完成所有解码。

您可以从base64string中去除数据:image …部分,并将这些数据传递给您的WriteFileAssistant。

 var strData = this.drawingCanvas.getContext().canvas.toDataURL(); var imgData = strData.replace(/^data:image\/\w+;base64,/, ""); this.call( { filePath:'/media/internal/Collage/image.png', data: imgData }, { method:"writeFile" } ); 

WriteFileAssistant只需要获取base64string并将其作为parameter passing给Buffer构造函数。 而且,在openSync调用中使用“+”也会导致事情中断。

 var WriteFileAssistant = function(){}; WriteFileAssistant.prototype.run = function(future, subscription) { var fs = IMPORTS.require('fs'); var filePath = this.controller.args.filePath; var fd = fs.openSync('<path>/image.png', 'w'); var buff = new Buffer(this.controller.args.data, 'base64'); fs.write(fd, buff, 0, buff.length, 0, function(err,written){ }); } 

Buffer接受一个string和一个编码,然后它使用编码值将string处理成一系列字节,所以当你告诉它string是base64的时候,它会为你解码base64并创build合适的解码字节数组写入文件。