我正在尝试使用node.js fs.writeFile
作为二进制文件来编写画布数据。 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 ...
),而是准确写入从客户端收到的数据。
我在这里做错了什么?
答案 0 :(得分:25)
JavaScript
语言没有用于读取或操纵二进制数据流的机制。Buffer
类是作为Node.js API的一部分引入的,可以在TCP流和文件系统操作等环境中与八位字节流进行交互。
纯javascript
虽然很适合unicode-encoded
个字符串,但却无法很好地处理直接二进制数据。
将大量数据写入socket
时,以binary
格式提供数据效率要高得多,而不必转换为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 = new Buffer(data, 'base64');
fs.writeFile('image.png', buf);
答案 1 :(得分:3)
我有这个问题。当我在“请求”库中将“ encoding”的默认值设为null时,我解决了问题
var request = require("request").defaults({ encoding: null });
var fs = require("fs");
fs.writeFile("./image.png", body, function(err) {
if (err) throw err;
});
答案 2 :(得分:0)
不是直接将文件写入客户端,而是请服务器发送 图片为二进制格式。
let request= {
headers: {
'Content-Type': 'image/jpeg',
'Authorization': "your token"
},
encoding:'binary'
};
request.get(url,request,(error, response, body)=>{
if(error){
console.log('error in get photo',error)
return "default image to server";
}else{
if(response.statusCode == 200){
Fs.writeFile('path',body,'binary',function(err){
if(err){
return "your message";
}else{
return "success";
}
})
}else{
console.log('error in get photo 3')
return "your message";
}
}
})
答案 3 :(得分:0)
不推荐使用Buffer.from
时使用Buffer
,将会收到以下警告
(节点:15707)[DEP0005] DeprecationWarning:由于安全性和可用性问题,不建议使用Buffer()。请改用Buffer.alloc(),Buffer.allocUnsafe()或Buffer.from()方法。
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);