我的 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