2011-09-07 18 views
6

私はキャンバスのtoDataUrl()をしようとしており、それはbase64のデータを与えます。私はそれをpngとして保存したいと思います。私はbase64から変換されたバイナリデータを取得できますが、NodeJsサービスを使用してファイルに書き込むことはできません。node.jsを使用してバイナリデータをファイルに書き込む方法は?

ファイルに直接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 : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/=", 

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

これまで保存していた保存コードを投稿することができますか? – loganfsmyth

+0

ありがとう、上記のコードを投稿しました。 – Kantesh

+0

あなたが投稿した内容は判読可能ですが、コードの書式の標準を確認してください。あなたは4つのスペースで全てをインデントし、 ''マークでそれらを囲むことはできません。 – loganfsmyth

答えて

8

あなたは、彼らが必要以上にはるかに困難なものを作っています。ノード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文字列を取り、バッファコンストラクタの引数としてそれを渡す必要があります。また、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){ 

    }); 
} 

バッファは、文字列とエンコーディングを取り、それは一連のバイトに文字列を処理するために、エンコード値を使用していますので、あなたが文字列をbase64であるということを教えたとき、それはあなたのためにbase64をデコードしますファイルに書き込むためにデコードされた適切な配列を作成します。

+0

ありがとう、私はこれをしました。これは、base64からのデータのデコードです。私は全体のコードを投稿しました。 – Kantesh

+0

ありがとう。私はそれを試しましたが、それはbase64に書かれていました。私はもう一度私が行方不明だったことをチェックします。 – Kantesh

+0

私が言いたいことを忘れてしまったもう一つの事は、私はウェブOSでそれをやっています。私はそれが支持されるべきかどうか分からない。 – Kantesh

関連する問題