我在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并尝试对该字符串进行解码,我也会收到错误消息。不知道我在做什么错...任何帮助将不胜感激。 谢谢
答案 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
,但这也不起作用(链接指出这是默认格式,这是不正确的。
问候,约翰·波普