toString(' base64')在节点中返回无效的图像数据

时间:2016-10-29 19:48:05

标签: javascript node.js

我目前有一个网站,我向服务器发送GET请求,并期望它从网站下载图像并将数据发送回客户端。如果我将下载的结果数据直接写入文件,则可以正常工作。

    app.get('/image', function(req, res) {
    request("http://ipcam/auto.jpg", {encoding: 'binary'}, function(err, response, body) {
        if (err) res.send(err);
        fs.writeFile('logo ' + (Math.random() * 1000).toFixed(0) + '.jpeg', body, 'binary', function(err){
        if (err) throw err
             console.log('File saved.')
         })
        res.send(200);
    });
});

但是,当我尝试使用Buffer对象将其转换为base64然后将其发送到客户端时,img标记无法将其识别为有效的图像数据。使用显示base64图像数据预览的在线实用程序确认了这一点。

服务器:

res.send(new Buffer(body.replace(/(\r\n|\n|\r)/gm,""), 'binary').toString('base64'));

客户端:

var xmlHttp = new XMLHttpRequest();
        xmlHttp.onreadystatechange = function() {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200 && xmlHttp.responseText != undefined) {
                var base64string = xmlHttp.responseText.replace(/(\r\n|\n|\r)/gm,"");
                document.getElementById('image').src = 'data:image/jpeg;base64,' + base64string;
            }
        };
        xmlHttp.open("GET", '/image', true);
        xmlHttp.send();

编辑:我删除了指出删除换行符的正则表达式。但它并没有帮助。

当前服务器:

res.send(new Buffer(body, 'binary').toString('base64'));

当前客户:

var xmlHttp = new XMLHttpRequest();
        xmlHttp.onreadystatechange = function() {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200 && xmlHttp.responseText != undefined) {
                document.getElementById('image').src = 'data:image/jpeg;base64,' + xmlHttp.responseText;
            }
        };
        xmlHttp.open("GET", '/image', true);
        xmlHttp.send();

2 个答案:

答案 0 :(得分:1)

  

{encoding:'binary'}

AFAIK如果您希望请求将响应解释为二进制数据,则应指定 encoding:null

(引用)

  

编码 - 用于响应数据的setEncoding的编码。如果为null,   身体作为缓冲区返回。其他任何东西(包括默认值   undefined的值)将作为编码参数传递给toString()   (这意味着默认情况下这是有效的utf8)。 (注意:如果你期望二进制   数据,你应该设置encoding:null。)

一旦你这样做, body 你得到的响应将被设置为Buffer,所以你可以直接做:

body.toString('base64')

答案 1 :(得分:0)

该行

res.send(new Buffer(body.replace(/(\r\n|\n|\r)/gm,""), 'binary').toString('base64'));

没有多大意义,你发送的字符串不是二进制文件。所以试试吧。

res.send(new Buffer(body).toString('base64'));