我目前有一个网站,我向服务器发送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();
答案 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'));