2011-09-07 15 views
6

मैं कैनवास के toDataUrl() करने की कोशिश कर रहा हूं, और यह base64 डेटा देता है। मैं इसे png के रूप में स्टोर करना चाहता हूं। मैं बेस 64 से परिवर्तित बाइनरी डेटा प्राप्त कर सकता हूं, लेकिन मैं इसे नोडजेएस सेवा का उपयोग कर फ़ाइल में लिख नहीं सकता।node.js का उपयोग कर फ़ाइल में बाइनरी डेटा कैसे लिखें?

यदि मैं सीधे फ़ाइल पर बेस 64 डेटा लिखता हूं, तो सभी डेटा लिखे जा सकते हैं, लेकिन यह 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

आप चीजों को बहुत कठिन की तुलना में वे होने की जरूरत है कर रहे हैं। नोड बफर ऑब्जेक्ट बेस 64 को इनपुट के रूप में लेता है और आपके लिए यह सब डिकोडिंग करता है।

आप केवल डेटा को स्ट्रिप कर सकते हैं: छवि ... बेस 64 स्ट्रिंग से भाग और उस डेटा को अपने 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 सिर्फ बेस 64 स्ट्रिंग लेने के लिए और पारित कि बफर निर्माता के लिए एक तर्क के रूप की जरूरत है। साथ ही, ओपनसिंक कॉल पर 'ए +' होने से चीज़ें भी टूट जाएंगी।

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){ 

    }); 
} 

बफर एक स्ट्रिंग और एक एन्कोडिंग लेता है, तो यह बाइट्स की एक श्रृंखला में स्ट्रिंग कार्रवाई करने के लिए एन्कोडिंग मान का उपयोग करता है, इसलिए जब आप यह कहना है कि स्ट्रिंग बेस 64 है, यह आप के लिए बेस 64 डिकोड और होगा फ़ाइल को लिखने के लिए बाइट्स के उचित डीकोडेड सरणी बनाएं।

+0

धन्यवाद, मैंने यह किया है। यह बेस 64 से डेटा डिकोड है। मैंने पूरा कोड पोस्ट किया है। – Kantesh

+0

धन्यवाद ... मैंने कोशिश की है, लेकिन लिखा गया था क्योंकि यह बेस 64 में है। मैं एक बार फिर से जांच करूँगा कि मैं क्या खो रहा था .. – Kantesh

+0

एक और बात जो मैं उल्लेख करना भूल गया था, मैं इसे वेब ओएस में कर रहा हूं। मुझे नहीं पता कि यह समर्थित होना चाहिए या नहीं। – Kantesh

संबंधित मुद्दे