【问题标题】:Upload pano Image using street View Publish API使用街景发布 API 上传全景图像
【发布时间】:2017-05-20 11:02:26
【问题描述】:

当我使用给定的街景 API 进行上传时

Request an Upload URL
        $ curl --request POST \
        --url 'https://streetviewpublish.googleapis.com/v1/photo:startUpload?key=YOUR_API_KEY' \
        --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
        --header 'Content-Length: 0'

Upload the photo bytes to the Upload URL
        $ curl --request POST \
        --url 'UPLOAD_URL' \
        --upload-file 'PATH_TO_FILE' \
        --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'

但它不起作用..

它给了我错误 No file found in request.

有人可以帮我解决这个问题吗..

在此先感谢您。

【问题讨论】:

  • 您解决了这个问题吗?你能在 UPLOAD_URL 上上传文件吗?
  • 是的兄弟我解决了
  • 你能在这里发布一个解决方案吗?这将是一个很大的帮助。有很多人在寻找这个解决方案。这将使这个问题很受欢迎@upendtu

标签: google-maps-api-3 google-street-view google-streetview-publish


【解决方案1】:

通过这种方式获取我解决的上传网址

$cur_upload_url = curl_init();

  curl_setopt_array($cur_upload_url, array(

   CURLOPT_URL => "https://streetviewpublish.googleapis.com/v1/photo:startUpload?key=XXXXXXXXXXX" ,
   CURLOPT_RETURNTRANSFER => true,
   CURLOPT_ENCODING => "" ,
   CURLOPT_CUSTOMREQUEST => "POST",
   CURLOPT_HTTPHEADER => array(
     "authorization: Bearer $access_token",
        "content-type: application/json",
        "Content-Length: 0"
        ), 
  ));

  $response = curl_exec($cur_upload_url);
  $re = '/https?:\/\/[^"]*/';
  $str = $response;
  preg_match($re, $str, $matches, PREG_OFFSET_CAPTURE, 0);
  $upload_url = $_SESSION['UploadRef'] = $matches[0][0];

  echo $upload_url;

将照片字节上传到上传 URL

$cmd = exec('curl --request POST \--url "'. addslashes($upload_url) .'" \--upload-file "'.$imagePath.'" \--header "Authorization: Bearer '. addslashes($access_token) .'" ');

然后上传照片的元数据

$curl_meta = curl_init();

  curl_setopt_array($curl_meta, array(
    CURLOPT_URL => "https://streetviewpublish.googleapis.com/v1/photo?key=XXXXXXXXXXXXXXXX",
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS => '{
                    "uploadReference":
                    {
                      "uploadUrl": "'.$upload_url.'"
                    },
                    "pose":
                     {
                       "heading": 95.0,
                       "latLngPair":
                       {
                         "latitude": '.$latVal.',
                         "longitude": '.$langVal.'
                       }
                    },
                    "captureTime":
                    {
                      "seconds":  '.$time_stamp.'
                    },
                  }',

    CURLOPT_HTTPHEADER => array(
       "authorization: Bearer $access_token",
       "content-type: application/json"
    ),

  ));


      $response_meta = curl_exec($curl_meta);
      $response_json = json_decode($response_meta, true);
      // $photoID = $response_json['photoId']['id'];
      // echo $photoID;


      if(curl_errno($curl_meta)){
        // this would be your first hint that something went wrong
        die('Couldn\'t send request: ' . curl_error($curl_meta));
      }else{
        //check the HTTP status code of the request.
        $resultStatus = curl_getinfo($curl_meta, CURLINFO_HTTP_CODE);
        if($resultStatus != 200){
          die('Request failed: HTTP status code: ' . $resultStatus);
        }else{
          $photoID = $response_json['photoId']['id'];
          //insert google publish information into db table

        }

      }



      curl_close($curl_meta);

从这里您将获得带照片的身份证件。

获取Photo iD发布成功后。

【讨论】:

  • 仅用于上传照片请求,您有用户 exec() 功能吗? curl 完成了吗?
  • 是的,因为我在使用 curl 时在那部分出错了这就是我使用 exec() 的原因
  • $imagePath 包含什么?图像应该在服务器上还是我们可以从本地计算机发布路径?
  • 这包含 PATH/TO/FILE
  • 好的,我在 localhost 进行测试,但我没有成功,但是当我将代码移动到实时服务器并测试它是否有效时。只需要放文件的绝对路径即可。使用过 realpath($_FILES['file']['name'])
【解决方案2】:

如果有人希望通过 node.js 服务器上传一些选项:

import { exec } from 'child_process';
await new Promise((resolve, reject) => {
  const uploadCmd = `curl --request POST \ --url "${uploadUrl}" \ --upload-file "${__dirname}/360.jpg" \ --header "Authorization: Bearer ${accessToken}" `;
  exec(uploadCmd, (err, stdout, stderr) => {
    if (err) {
      // node couldn't execute the command
      console.log('err', err);
      reject(err);
      return false;
    }
    resolve({stdout, stderr});
    console.log(`Succesfully uploaded: 
      stdout: ${stdout}
      stderr: ${stderr}
    `);
  });
});

不要忘记在 async 函数中执行 await 部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多