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

28 浏览
0 Comments

如何使用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};

0
0 Comments

问题的原因是代码中使用了错误的方式将二进制数据以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格式写入文件,问题得到解决。

0