保存谷歌将api照片放到我的服务器上

时间:2016-06-21 12:33:39

标签: php image google-maps google-places-api

我需要将从google places API返回的图像保存到我的服务器。 我试过了:

$url= 'https://maps.googleapis.com/maps/api/place/photo?key=API_KEY_HERE&photo_reference=CoQBcwAAAAtXfnhO3WCagOlY4p4Px7N8Pcks_N-cLbMQzruT-AdWRZoyJgABVUUcuZ_4bbcUdReloBl2zGd80W4E4w-N_kyab4xz4S3ZZIRVECCJP1u7JsXOfxEsx4XQbL-HeMBRKzNul0XSdy-Dv4495i_8-SqYqTBZMaLvn1YLaVM3aAzOEhBgLV4lpKeM39L6gb9wBbU6GhSmCkYp8djpm9_iaqkS93z4ekLnNg&maxheight=200'

$target = md5($array['result']['photos'][0]['photo_reference']);
$newname = 'img/googlephotos/newimage'.$target;
file_put_contents($newname,file_get_contents($url));

但是它无法正常工作 - 当它保存它时会保存一个空文件而不是图像 - 我认为它缺少文件扩展名但我不确定如何获取它。有谁知道保存谷歌地方照片的任何方法?

我使用PHP编写代码。

任何帮助都会很棒

5 个答案:

答案 0 :(得分:2)

您应该了解服务条款中的限制。特别是,第10.5(d)段说:

  

您不会预先获取,缓存,索引或存储要在服务之外使用的任何内容,但您可以存储有限数量的内容,仅用于提高由于网络而导致的Maps API实施的性能延迟(而不是为了阻止Google准确跟踪使用情况),并且仅在此类存储时:   是暂时的(在任何情况下都不超过30个日历日);是安全的;   不会操纵或汇总内容或服务的任何部分;和   不以任何方式修改归属地。<​​/ p>

https://developers.google.com/maps/terms#10-license-restrictions

此时看起来ToS不允许在您的服务器上保存图像。

答案 1 :(得分:0)

您首先需要使用Google Places Photo API来获取图片资源:

<强> https://maps.googleapis.com/maps/api/place/photo?maxwidth=[width]&photoreference=[photo_reference]&key=[apiKEY]

它应该返回状态:200 一个可以使用以下方式保存的实际图像资源

file_put_contents({{path}},{{image resource}});

答案 2 :(得分:0)

回答你的问题我尝试做一些类似于你的事情但是使用重定向网址(secon one)。如您所知,当您想从Google地方信息中获取照片网址时,您必须发送此网址:

$url = "https://maps.googleapis.com/maps/api/place/photo?maxwidth=$maxwidth&photoreference=$reference&key=$api_key";

然后它重定向到:

https://lh6.googleusercontent.com/-n5VUsX_0WSA/VU3vvlOKX3I/AAAAAAAAEN8/yg9TAhSbvCwC8lA3bB56SjcUcAx3zXYtQCLIB/s1600-w800/

我做的是先获取第二个网址,然后尝试从cURL获取文件,但结果与你相似,一个空文件(0bytes),我尝试使用不同的格式(jpg,png和gif)

function get_photos_from_google_places($reference){
        $api_key = "YOUR API KEY";
        $maxwidth = 800;
        $url = "https://maps.googleapis.com/maps/api/place/photo?maxwidth=$maxwidth&photoreference=$reference&key=$api_key";

        $furl = false;
        // First check response headers
        $headers = get_headers($url);
        // Test for 301 or 302
        if(preg_match('/^HTTP\/\d\.\d\s+(301|302)/',$headers[0]))
        {
            foreach($headers as $value)
            {
                if(substr(strtolower($value), 0, 9) == "location:")
                {
                    $furl = trim(substr($value, 9, strlen($value)));
                }
            }
        }
        // Set final URL
        $furl = ($furl) ? $furl : $url;

        //Save the photo file to directory
        $ch = curl_init($furl);
        $fp = fopen('./files/media/image.png', 'wb');
        curl_setopt($ch, CURLOPT_FILE, $fp);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_exec($ch);
        curl_close($ch);
        fclose($fp);

        echo $furl;
        echo "<br><hr>";
        echo $fp; die();

    }

也许这可以给你一些想法。如果有人知道怎么做,那就会感激不尽。

非常感谢,

答案 3 :(得分:0)

这对我有用。

$query = "https://maps.googleapis.com/maps/api/place/photo?maxwidth=800&photoreference=PHOTO_REF&key=API_KEY";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $query);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$a = curl_exec($ch);
$url = Null;
if(preg_match('#Location: (.*)#', $a, $r)) {
     $url = trim($r[1]);
}

答案 4 :(得分:0)

我们必须首先了解 Google许可条件

  

3.2.4禁止滥用服务的限制。

     

禁止刮刮客户将不会提取,出口或刮刮   在服务之外使用的Google Maps Content。例如,   客户不会:(i)预取,索引,存储,转发或重新托管   服务之外的Google Maps Content; (ii)批量下载Google   地图图块,街景图像,地理编码,方向,距离矩阵   结果,道路信息,地点信息,高程值和   时区详细信息; (iii)复制并保存公司名称,地址或   用户评论;或(iv)通过文字转语音使用Google Maps Content   服务。

更多帮助:

https://cloud.google.com/maps-platform/terms/#3-license