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

时间:2017-04-19 05:57:33

标签: javascript node.js binary

我正在尝试使用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 ...),而是准确写入从客户端收到的数据。

我在这里做错了什么?

4 个答案:

答案 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);

Reference

答案 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);