如何使用原始数据将图像作为节点HTTPS响应发送

问题描述 投票:0回答:1

我正在节点HTTPS服务器中编写返回图像的路径。问题是我从另一个外部API调用中获取了此图像(图像数据存在于res.body中)。该图像抓取基本上是返回图像的另一个API的代理。

我已经打印出对外部API的响应,并且看到了图像数据。它还会在邮递员中打开该图像,但是当我使用自己的Node服务器作为代理进行呼叫时,我将收到故障响应或图片不显示。我尝试中最常见的错误是邮递员试图显示图像时出现“解析错误”。

逻辑流程是,我使用图像调用了API。如果响应为200,则获取该响应信息,并将其设置为来自节点服务器的响应。代码如下:

function axisGetImage(command, webResponse){

  var commandURL = config.CameraIP;
  commandURL += '/GrabImage';

 //console.log(commandURL);
  const options = {
    'auth': {
      'user': username,
      'pass': password,
      'sendImmediately': false
    }
  }
  console.log(commandURL);

  request.get(commandURL, options, function(err, res, body){
    if(res.statusCode == 200){
      console.log(res.headers);
      //webResponse.setHeader('content-type', res.headers['content-type']);
      webResponse.setHeader('content-length', res.headers['content-length']);
      webResponse.setHeader('cache-control', res.headers['cache-control']);
      webResponse.setHeader('pragma', res.headers['pragma']);
      webResponse.setHeader('connection', res.headers['connection']);
      webResponse.writeHead(200,{"Content-Type":res.headers['content-type']});
      var base64data = Buffer.from(res.body).toString('base64');
      //body.write(res.body);
      console.log(webResponse.headers);
      //webResponse.write(base64data);
      webResponse.end(base64data);
    }else{
      webResponse.end('Image pull failed');
    }
    console.log(res.statusCode);
  });

}
node.js express request buffer jpeg
1个回答
0
投票

已解决:当您设置对外部服务器的初始请求的选项时,请指定请求中没有编码:

  const options = {
    'auth': {
      'user': username,
      'pass': password,
      'sendImmediately': false
    },
    encoding: null
  }

然后,您可以简单地将请求返回的主体(图像数据)直接写入节点服务器的响应,从而代理对图像的请求。

request.get(commandURL, options, function(err, res, body){
    if(res.statusCode == 200){
      webResponse.setHeader('content-length', res.headers['content-length']);
      webResponse.setHeader('cache-control', res.headers['cache-control']);
      webResponse.setHeader('pragma', res.headers['pragma']);
      webResponse.setHeader('connection', res.headers['connection']);
      webResponse.writeHead(200,{"Content-Type":res.headers['content-type']});
      webResponse.end(body, 'binary');
    }else{
      webResponse.end('Image pull failed');
    }
    //console.log(res.statusCode);
  });
© www.soinside.com 2019 - 2024. All rights reserved.