我正在尝试用 node.js 编写画布数据fs.writeFile https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback作为二进制文件。 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 语言没有读取或操作二进制数据流的机制。这Buffer
该类作为 Node.js API 的一部分引入,以便可以在 TCP 流和文件系统操作等上下文中与八位字节流进行交互。
纯 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, /* callback will go here */);
参考 https://gist.github.com/madhums/e749dca107e26d72b64d
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)