2017-04-06 54 views
0

我正在使用下载图像的第三方服务,但它的响应主体包括html和base64(不确定)图像内容。响应包含内容类型为image/jpeg; charset=utf-8如何从http响应使用node.js获取原始图像

回应示例:

����JFIF``��C  

$.' ",#(7),01444'9=82<.342��C   

2!!22222222222222222222222222222222222222222222222222��"�� 
���}!1AQa"q2���#B��R��$3br� 
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���������������������������������������������������������������������������  
���w!1AQaq"2�B���� #3R�br� 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
</head> 
<body onload="initslide('method1,method2,method3', '');"> 
    // More html goes here 
</body> 
</html> 

和服务电话:

var params = { 
    url : serviceUrl, 
    form : form, 
    headers : headers 
}; 

request.post(params, function(error, response, body) { 
    if (error) { 
    console.error("Error:", error); 
    return; 
    } 
    callback(body); // In body i am getting above response 
}); 

现在,我只有在下载它的图像部分感兴趣,并将其保存在云中PNG/jpeg格式。任何想法如何在node.js中实现这一点。

+0

我可以问你正在使用哪种服务?我可以帮助我制定一个答案。需要做的是将图像数据从HTML中分离出来。我们只需要弄清图像结束和HTML开始的方案。 – powerc9000

+0

@ powerc9000那么,我不能透露这项服务,因为它是专有的第三方服务。 – user3640709

回答

0

我想我们可以假设图像不包含序列\n\n<!所以让我们分开。

var parts = body.split('\n\n<!') 

现在第一部分应该包含我们的图像

var imageData = new Buffer(parts[0], 'binary'); 

然后我们可以将此保存到一个文件

//I'm just assuming jpg for now 
fs.writeFile('out.jpg', imageData, cb); 

可以做更多的解释文件类型和使其更强大,但这是它背后的基本理念。

或者,您可以将整个文件读入缓冲区,然后在JPEG(FFD9)中查找图像序列的结尾,它会告诉您图像何时开始并且html结束。

var data = new Buffer(body, 'binary'); 
for(var i=0; i<data.length; i++){ 
    if(data[i] === 0xff && data[i+1] === 0xd9){ 
     //end of file 
+0

谢谢@ powerc9000,我会试试这个。当我使用REST客户端测试服务时,有一个问题会提取图像,并在图像选项卡部分显示。这是如何工作的? – user3640709

+0

这不起作用 – user3640709

+0

@ user3640709有没有很多事情要做,所以我很难真正帮助。如果完全有可能保存一个HTML响应并发送给我,我可能会为你做更多的事情。 – powerc9000