2011-09-07 14 views
6

Sto provando a fare toDataUrl() di tela, e dà dati base64. Voglio memorizzarlo come png. Posso ottenere i dati binari convertiti da base64, ma non posso scriverlo su un file usando il servizio NodeJs.Come scrivere dati binari in un file usando node.js?

Se scrivo dati base64 direttamente nel file, tutti i dati possono essere scritti, ma non può essere un png giusto ?. Voglio memorizzare i dati binari da memorizzare. Come farlo?

Codice frammento:

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

Puoi pubblicare un po 'del codice di salvataggio che hai finora, quindi abbiamo qualcosa su cui lavorare? – loganfsmyth

+0

Grazie, ho pubblicato il codice sopra. – Kantesh

+0

Ciò che hai postato è leggibile, ma ti preghiamo di rivedere gli standard di formattazione del codice. Dovresti indentare ogni cosa con 4 spazi, non avvolgerli con segni ''. – loganfsmyth

risposta

8

si stanno facendo le cose molto più difficile di quanto hanno bisogno di essere. L'oggetto Buffer del nodo prende base64 come input e fa tutto ciò che decodifica per te.

È possibile semplicemente rimuovere i dati: immagine ... parte dalla stringa base64 e passare tali dati a 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" 
    } 
); 

Il la WriteFileAssistant deve solo prendere la stringa base64 e passare tale come argomento al costruttore Buffer. Inoltre, avere 'a +' sulla chiamata openSync interromperà anche le cose.

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 prende una stringa e una codifica, quindi utilizza il valore di codifica per elaborare la stringa in una serie di byte, così quando si dice che la stringa è base64, sarà decodificare il base64 per te e crea l'array decodificato corretto di byte da scrivere nel file.

+0

Grazie, l'ho fatto. È una decodifica dei dati da base64. Ho pubblicato un intero codice. – Kantesh

+0

Grazie ... l'ho provato, ma è stato scritto così com'è in base64. Controllo ancora una volta cosa mi mancava .. – Kantesh

+0

Un'altra cosa che ho dimenticato di menzionare è che lo faccio in web Os. Non so se dovrebbe essere supportato. – Kantesh

Problemi correlati