我的Express应用程序正在从浏览器中接收base64编码的PNG(使用toDataURL()从画布生成)并将其写入文件。但是该文件不是有效的图像文件,因此“文件”实用程序只是将其标识为“数据”。
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 });
我认为您正在转换的数据比您需要的更多。一旦使用正确的编码创建了缓冲区,您只需要将缓冲区写入文件即可。
var base64Data = req.rawBody.replace(/^data:image\/png;base64,/, ""); require("fs").writeFile("out.png", base64Data, 'base64', function(err) { console.log(err); });
new Buffer(…,’base64’)通过将输入解释为base64编码的字符串,将输入字符串转换为Buffer,它只是字节数组。然后,您可以将该字节数组写入文件。
如评论中所述,req.rawBody已不再是一回事。如果使用express/ connect,则应使用bodyParser()中间件并使用req.body,并且如果使用标准Node进行此操作,则需要聚集传入的data事件Buffer对象,并在end回调中进行此图像数据解析。
req.rawBody
express
connect
bodyParser()
req.body
data
Buffer
end