6

我試圖用gapi上傳圖片到谷歌雲存儲。目前的代碼,我是上傳到谷歌雲儲存使用JSON API從JavaScript

<script src="https://apis.google.com/js/api.js"></script> 
<script type="text/javascript"> 
var imgData = null; 

function getImage() { 
    navigator.camera.getPicture(onSuccess, onFailure, { 
     destinationType: navigator.camera.DestinationType.FILE_URI, 
     sourceType: navigator.camera.PictureSourceType.PHOTOLIBRARY 
    }); 

    function onSuccess(imageURI) { 
     imgData = encodeImageUri(imageURI); 
     var contentLen = imgData.length; 
     gapi.load('client', start); 
    } 

    function onFailure(message) { 
     alert("Get image failed: " + message); 
    } 
} 

function start() { 
    // 2. Initialize the JavaScript client library. 
    console.log('firing google storage api'); 
    gapi.client.init({ 
     'apiKey': 'XXX-XX' 
    }).then(function() { 
     // 3. Initialize and make the API request. 
     console.log('api initialized'); 
     var request = gapi.client.request({ 
      'path': 'https://www.googleapis.com/upload/storage/v1/b/visionapibucket/o?uploadType=media&name=myObject', 
      'method': 'POST', 
      'headers': { 
       'Content-Type': 'image/jpeg' 
      }, 
      'body': imgData 
     }); 

     try { 
      //Execute the insert object request 
      console.log('executing call'); 
      request.execute(function(resp) { 
       alert(resp); 
      }); 

     } catch (e) { 
      console.log('An error has occurred: ' + e.message); 
     } 
    }).then(function(response) { 
     console.log(response.result); 
    }, function(reason) { 
     console.log('Error: ' + reason.result.error.message); 
    }); 
}; 
</script> 

我可以看到代碼打 本聲明控制檯api initialized

,但我沒有看到gapi.client.request稱爲甚至打印任何錯誤等

我不知道什麼是錯在這裏。請指教

+0

我不知道多少關於這個'google api',但我可以告訴一件事''gapi.client.request'的*參數*是'path','method','params','header','body',如文檔[這裏](https://developers.google。com/api-client-library/javascript/reference/referencedocs#gapiclientrequestargs),請在糾正此問題後發送您的輸入。 –

+0

只需要路徑,其他都是可選的 – Vik

+0

但是'content type'不是一個參數,它應該以'header {'Content-type':'image/jpeg'}'的形式發送,請在糾正這個之後發送你的輸入 –

回答

1

你不能只用API密鑰文件上傳到谷歌存儲。你必須有一個oauth標記。

如果請求需要授權(例如對個人私人數據的請求),那麼應用程序必須提供OAuth 2.0令牌和請求。應用程序也可能提供API密鑰,但它不必。

如果請求不需要授權(如公共數據的請求),那麼應用程序必須提供的API密鑰或OAuth 2.0令牌,或兩者,無論是選擇您最方便的。

https://cloud.google.com/storage/docs/json_api/v1/how-tos/authorizing

在你的情況,你要上傳,所以你必須有OAuth憑證。

您有幾種解決方法:

  • 您可以將文件上傳到服務器,並上傳到您使用通過使用服務帳戶服務器憑據。
    https://cloud.google.com/compute/docs/access/service-accounts

  • 您可以在您的服務器上創建令牌並將其發送給您的客戶端。然後客戶可以上傳一個文件到您的谷歌存儲帳戶不會對谷歌存儲帳戶用戶的永久訪問令牌

  • 您可以上傳。爲此,他們必須登錄到您的應用程序。 https://developers.google.com/identity/protocols/OAuth2

  • 最後一種方法是,您可以將文件上傳到您的服務器,並通過執行gutil mv命令將其複製到雲中。在這種情況下,所有你需要做的就是通過使用gcloud auth gustil mvgcloud mv command

更多信息有關gcloud實用一次登錄到您的谷歌的雲帳號,並下載:https://cloud.google.com/sdk/

+0

我同意你上面所說的,但我的問題在於,即使是通話也不會發生。我應該看到一個auth錯誤或權限錯誤。不是嗎? – Vik

相關問題