如何使用node.js将二进制数据写入文件?
如何使用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)在下面定义 this.call({filePath:'/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(' /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格式写入文件。解决方法是使用Node.js的Buffer对象,它可以接受base64格式的输入并进行解码。可以通过删除base64字符串中的"data:image..."部分,并将数据传递给WriteFileAssistant来实现。
首先,从drawingCanvas对象获取base64格式的字符串数据,并使用replace方法删除"data:image/..."部分,得到纯净的base64数据。然后,调用WriteFileAssistant的run函数,并传递文件路径和base64数据作为参数。在WriteFileAssistant的run函数中,使用fs模块的openSync函数打开文件,并创建一个Buffer对象,将base64数据作为参数传递,并指定编码格式为base64。最后,使用fs模块的write函数将Buffer对象写入文件。
需要注意的是,代码中的'w'参数表示打开文件的方式为写入模式,而不是追加模式。另外,该解决方法适用于Node.js环境,可能不适用于WebOS环境。
在的问题中,还有一些回复提到了其他的问题和解决方法,但与问题的原因和解决方法无关,因此不在文章中提及。最终,通过修复代码中的错误,并正确使用Buffer对象将二进制数据以base64格式写入文件,问题得到解决。