Вы делаете вещи намного сложнее, чем они должны быть. Объект Buffer узла принимает base64 в качестве ввода и выполняет все это декодирование за вас.
Вы можете просто вырезать часть data: image ... из строки base64 и передать эти данные в свой 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 также может привести к поломке.
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 для вас и создает правильный декодированный массив байтов для записи в файл.