2011-09-07 44 views
6

Tôi đang cố gắng làm toDataUrl() của canvas và cung cấp dữ liệu base64. Tôi muốn lưu trữ nó dưới dạng png. Tôi có thể nhận được dữ liệu nhị phân được chuyển đổi từ base64, nhưng tôi không thể ghi nó vào một tệp bằng dịch vụ NodeJs.Làm thế nào để ghi dữ liệu nhị phân vào một tệp bằng cách sử dụng node.js?

Nếu tôi ghi dữ liệu base64 trực tiếp vào tệp, tất cả dữ liệu có thể được ghi, nhưng không thể là png đúng ?. Tôi muốn lưu trữ dữ liệu nhị phân được lưu trữ. Làm thế nào để làm nó?

đoạn Code:

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

Bạn có thể đăng một chút mã tiết kiệm mà bạn có cho đến giờ để chúng tôi có một số thứ để làm việc cùng không? – loganfsmyth

+0

Cảm ơn bạn, tôi đã đăng mã ở trên. – Kantesh

+0

Nội dung bạn đã đăng có thể đọc được, nhưng vui lòng xem lại các tiêu chuẩn định dạng mã. Bạn có nghĩa vụ phải thụt lề tất cả mọi thứ với 4 không gian, không quấn chúng với các dấu '. – loganfsmyth

Trả lời

8

Bạn đang làm cho mọi thứ khó khăn hơn nhiều so với họ cần phải được. Đối tượng Buffer nút lấy base64 làm đầu vào và thực hiện tất cả giải mã đó cho bạn.

Bạn chỉ có thể tách dữ liệu: hình ảnh ... một phần khỏi chuỗi base64 và chuyển dữ liệu đó đến WriteFileAssistant của bạn.

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

Trình WriteFileAssistant chỉ cần lấy chuỗi base64 và chuyển đối số đó làm đối số cho hàm tạo bộ đệm. Ngoài ra, có 'a +' trên cuộc gọi openSync cũng sẽ phá vỡ mọi thứ.

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 mất một chuỗi và một mã hóa, sau đó nó sử dụng các giá trị mã hóa để xử lý các chuỗi vào một loạt các byte, vì vậy khi bạn nói với nó rằng chuỗi là base64, nó sẽ giải mã Base64 cho bạn và tạo mảng byte được giải mã thích hợp để ghi vào tệp.

+0

Cảm ơn bạn, tôi đã làm điều này. Nó là một giải mã dữ liệu từ base64. Tôi đã đăng toàn bộ mã. – Kantesh

+0

Cảm ơn bạn .. Tôi đã thử nó, nhưng đã được viết vì nó nằm trong base64. Tôi sẽ kiểm tra lại một lần nữa những gì tôi đã mất tích .. – Kantesh

+0

Một điều nữa tôi quên đề cập đến là, tôi làm điều đó trong web Os. Tôi không biết liệu nó có nên được hỗ trợ hay không. – Kantesh

Các vấn đề liên quan