在Node.js中从Google StreetView API保存图像的问题

时间:2019-10-21 02:50:15

标签: node.js google-api get

我在nodejs中有以下代码。与邮递员通话时,我得到了预期的结果。

const request = require('request-promise');
const querystring = require('querystring');
const fs = require('fs');


function getStreetViewImage(address) {
  const KEY = [API KEY];
  const SIZE = '600x400';

  let params = {
    'location': address,
    'key': KEY,
    'size': SIZE
  };

  var options = {
    uri: 'https://maps.googleapis.com/maps/api/streetview',
    qs: params,
    headers: {
      'User-Agent': 'Request-Promise'
    },
    resolveWithFullResponse: true
  }

  request(options)
  .then(function (data) {
     const buffer = Buffer.from(data.body, 'utf8');
     fs.writeFileSync('image.jpeg', buffer);
  })
  .catch(function (err) {
      console.log(err.toString());
  });

}

data.headers中的内容类型和长度与邮递员返回的内容匹配。 但是,当打开生成的文件时,图像有错误,并且不显示任何内容。如果我将图像编码为base64并尝试对该字符串进行解码,我也会收到错误消息。不知道我在做什么错...任何帮助将不胜感激。 谢谢

1 个答案:

答案 0 :(得分:0)

我正在研究一个类似的问题。一种(部分)对我有用的解决方案是:

const request = require('request-promise-native');
const fs = require('fs');
...
let options =
{
  method: "GET",
  url: `https://maps.googleapis.com/maps/api/streetview`,
  qs: {
    key: '[API KEY]',
    size: '400x300',
    location: `address`
  },
  "Accept-Charset": "utf-8", // don't know if this is important
  json: true
};

await request(options).pipe(fs.createWriteStream('streetview.jpg', { flags: 'w' })); // overwrite

这将创建图像文件,但是在我的情况下,问题是await在正确关闭文件之前返回。然后,await之后的代码通常会找到一个零长度的文件。我尚未找到解决方案。我通过将上面的代码改写为:

try
{
  let stream = fs.createWriteStream('streetview.jpg', { flags: 'w', encoding: ???? });

  stream.on('finish', async () =>
  {
    // rest of my code after the file is properly closed
  });

  stream.write(await request(options));
  stream.end(); // flush file buffer and close the file
}
catch (err)
{
  ...
}

但是现在发生的是,尽管创建了streetview.jpg,但它似乎不再是有效的.jpg文件。我尝试通过在代码中的????处尝试几种编码来解决此问题,但是没有任何失败。我对createWriteStream经验不足,因此可能有一个简单的解决方案(?)。

我还在https://developers.google.com/maps/documentation/maps-static/dev-guide#map-parameters处发现,您可以在options对象中指定一个format参数,并尝试了png,但这也不起作用(链接指出这是默认格式,这是不正确的。

问候,约翰·波普