我正在尝试使用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