My Express app is receiving a base64-encoded PNG from the browser (generated from canvas with toDataURL() ) and writing it to a file. But the file isn’t a valid image file, and the “file” utility simply identifies it as “data”.
var body = req.rawBody,
base64Data = body.replace(/^data:image\/png;base64,/,""),
binaryData = new Buffer(base64Data, 'base64').toString('binary');
require("fs").writeFile("out.png", binaryData, "binary", function(err) {
console.log(err); // writes out file without error, but it's not a valid image
});
I think you are converting the data a bit more than you need to. Once you create the buffer with the proper encoding, you just need to write the buffer to the file.
new Buffer(…, ‘base64’) will convert the input string to a Buffer, which is just an array of bytes, by interpreting the input as a base64 encoded string. Then you can just write that byte array to the file.
Update
As mentioned in the comments,
req.rawBodyis no longer a thing. If you are usingexpress/connectthen you should use thebodyParser()middleware and usereq.body, and if you are doing this using standard Node then you need to aggregate the incomingdataeventBufferobjects and do this image data parsing in theendcallback.