【问题标题】:How to write binary data to a file using node.js?如何使用 node.js 将二进制数据写入文件?
【发布时间】:2011-09-07 05:14:50
【问题描述】:

我正在尝试做 toDataUrl() 的画布,它提供了 base64 数据。我想将其存储为png。我可以从 base64 获取转换后的二进制数据,但我无法使用 NodeJs 服务将其写入文件。

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

代码 sn-p:

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};

【问题讨论】:

  • 您能否发布一些您目前拥有的保存代码,以便我们可以使用一些东西?
  • 谢谢,上面的代码我已经贴出来了。
  • 您发布的内容是可读的,但请查看代码格式标准。您应该用 4 个空格缩进所有内容,而不是用 `` 标记包裹它们。
  • 对不起.. 我尝试缩进,但没有缩进。

标签: javascript node.js file-io png


【解决方案1】:

你让事情变得比他们需要的更难。节点 Buffer 对象将 base64 作为输入,并为您完成所有解码。

您可以从 base64 字符串中剥离 data: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 只需要获取 base64 字符串并将其作为参数传递给 Buffer 构造函数。此外,在 openSync 调用中使用“a+”也会造成问题。

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接受一个字符串和一个编码,然后它使用编码值将字符串处理成一系列字节,所以当你告诉它字符串是base64时,它会为你解码base64并创建正确的解码要写入文件的字节数组。

【讨论】:

  • 谢谢,我已经做到了。它是来自base64的数据解码。我已经发布了整个代码。
  • 谢谢..我试过了,但是是用base64写的。我会再次检查我错过了什么..
  • 还有一件事我忘了说,我是在 web 操作系统中做的。不知道是不是应该支持。
  • 谢谢,它成功了。我必须改变的是'a+'。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多