我正在尝试使用node.js fs.writeFile 作为二进制文件来编写 Canvas 数据。 JPEG文件,但是在写入文件后,我可以看到该文件存储为纯文本格式,而不是二进制数据。

这是从客户端发送到我的节点的data的示例,代表JPEG图像数据(仅几个开头字符):
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAFA3PEY8MlBGQUZaVVBfeM...
我通过执行以下操作在客户端上获得此data :

canvas.toDataURL('image/jpeg', 0.5).replace('data:image/jpeg;base64,', '')

这是我的 node.js服务器中的功能用法:
fs.writeFile('../some.jpeg', data, 'binary', function(err){});

而不是将文件写入二进制文件(״״ JFIF ...),它完全写入从客户端接收到的数据。

我在这里做错了什么?

最佳答案


纯JavaScript虽然适用于Unicode编码的字符串,但不能很好地处理直接的二进制数据。
将大量数据写入套接字时,以二进制格式存储该数据要比从Unicode转换要有效得多。

var fs = require('fs');
// string generated by canvas.toDataURL()
var img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0"
    + "NAAAAKElEQVQ4jWNgYGD4Twzu6FhFFGYYNXDUwGFpIAk2E4dHDRw1cDgaCAASFOffhEIO"
    + "3gAAAABJRU5ErkJggg==";
// strip off the data: url prefix to get just the base64-encoded bytes
var data = img.replace(/^data:image\/\w+;base64,/, "");
var buf = Buffer.from(data, 'base64');
fs.writeFile('image.png', buf);
Reference

10-08 07:40
查看更多