Похоже, это работает
canvas.toBlob(saveBlob);
function saveBlob(blob) {
const reader = new FileReader();
reader.onloadend = () => {
fs.writeFile('filename.png', new Uint8Array(reader.result), err => {
if (err) {
alert("An error ocurred creating the file " + err.message);
} else {
console.log("The file has been successfully saved");
}
});
}
reader.readAsArrayBuffer(blob);
}
примечание в 2019 году, я мог бы перейти к обещаниям и асинхронным вещам. Там немного настройки, но затем использование легче для некоторого определения проще
const fs = require('fs'); // would prefer import
const util = require('util');
const writeFile = util.promisify(fs.writeFile);
function readBlobAsUint8Array(blob) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onloadend = () => {
return new Uint8Array(reader.result);
};
reader.onerror = reject;
reader.readAsArrayBuffer(blob);
});
}
function getCanvasAsBlob(canvas) {
return new Promise((resolve) => {
canvas.toBlob(resolve);
});
}
async function saveCanvasAsPNG(filename, canvas) {
const blob = await getCanvasAsBlob(canvas);
const data = await readBlobAsUint8Array(blob);
await writeFile(filename, data);
}
, которая может быть вызвана из другой асинхронной функции, например
async function someFunc() {
try {
await saveCanvasAsPNG('foo.png', canvas);
console.log('success');
} catch (e) {
alert(e);
}
}
или из не асинхронной функции как
saveCanvasAsPng('foo.png', canvas)
.then(() => {
console.log('success');
})
.catch(alert);
обратите внимание, это также работает
const dataUrl = canvas.toDataURL();
const uu = dataUrl.substring('data:image/png;base64,'.length);
fs.writeFileSync(filename, uu, 'base64');