2011-09-07 158 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字符串並將其作爲參數傳遞給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){ 

    }); 
} 

緩衝區將一個字符串編碼,然後使用編碼值的字符串處理成一系列的字節,所以當你告訴它該字符串的base64,它將解碼的base64爲您和創建正確解碼的字節數組以寫入文件。

+0

謝謝,我已經做到了。這是來自base64的數據解碼。我發佈了完整的代碼。 – Kantesh

+0

謝謝..我已經嘗試過了,但是它是在base64中編寫的。我再次檢查我失蹤的事情。 – Kantesh

+0

我忘了提及的另外一件事是,我在網絡操作系統中做這件事。我不知道它是否應該得到支持。 – Kantesh