使用node.js fs.writeFile编写二进制数据以创建映像文件

Kob*_*uek 11 javascript binary node.js

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

这是data从客户端发送到我的节点的示例,表示JPEG图像数据(只是几个第一个字符):

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAFA3PEY8MlBGQUZaVVBfeM...

我通过以下方式data 在客户端得到这个:

canvas.toDataURL('image/jpeg', 0.5).replace('data:image/jpeg;base64,', '')
Run Code Online (Sandbox Code Playgroud)

这是我的node.js服务器中的函数用法:

fs.writeFile('../some.jpeg', data, 'binary', function(err){});
Run Code Online (Sandbox Code Playgroud)

它不是将文件写为binary(????? JFIF ...),而是准确地写入从客户端收到的数据.

我在这做错了什么?

Ray*_*yon 29

Buffer语言没有用于读取或操纵二进制数据流的机制.该Buffer班介绍了作为Node.js的API的一部分,以使其能够与八位字节流中的东西像TCP流和文件系统操作的情况下进行交互.

Buffer,虽然Buffer字符串很好,但不能很好地处理直接二进制数据.

在向a写入大量数据时Buffer,以Buffer格式化数据和从必须转换的数据提高效率要高得多Buffer.

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 = new Buffer(data, 'base64');
fs.writeFile('image.png', buf);
Run Code Online (Sandbox Code Playgroud)

参考

  • 人造丝,这很完美.感谢您的帮助,以色列的和平与爱. (3认同)
  • *“纯 javascript...不能很好地处理直接二进制数据。”* - 鉴于这是最近的问答,我不明白这个答案。您完全错过了“TypedArrays”和“ArrayBuffer”吗?二进制数据在 Javascript 中不是问题,虽然它很“新”,但并不完全是新的。.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays (2认同)

Yak*_* Ad 13

我有这个问题。我在“请求”库中将“编码”的默认值设为空时解决了问题

var request = require("request").defaults({ encoding: null });
var fs = require("fs");

fs.writeFile("./image.png", body, function(err) {
    if (err) throw err;
});
Run Code Online (Sandbox Code Playgroud)