2016-06-09 60 views
0

我使用GCSService在GoogleCloudStorage存儲桶中寫入文件,所有這些都可以在線實例正常工作,但是當我想在本地開發服務器上測試我的代碼時,不可能寫入一個存儲桶(像數據存儲一樣模擬本地存儲區)。 額外的困難我試圖寫在我的本地服務器與胖客戶端的遠程API,我在網上搜索我沒有找到我的答案。 當我打電話給我的createOrUpdate()方法,我有這樣的例外:Google App引擎Java API在本地開發服務器上寫入存儲桶不起作用

com.google.appengine.tools.cloudstorage.NonRetriableException: java.lang.RuntimeException: Server replied with 403, verify ACLs are set correctly on the object and bucket: Request: POST https://storage.googleapis.com/InstanceName/FileInfos 

它似乎試圖在我的網上桶寫...

GcsService gcsService = GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance()); 
... 
RemoteApiOptions destination = RemoteConnection.connect(destinationServer); 
RemoteApiInstaller destinationInstaller = new RemoteApiInstaller(); 
destinationInstaller.install(destination); 
try 
{ 
    GcsOutputChannel outputChannel = gcsService.createOrReplace(new GcsFilename(destinationBucketServer, fileInfo.getFilename()), 
      GcsFileOptions.getDefaultInstance()); 

    outputChannel.write(ByteBuffer.wrap(data)); 
    outputChannel.close(); 
} 
catch (Exception e) 
{ 
    .... 
} 
finally 
{ 
    buffer.flush(); 
    destinationInstaller.uninstall(); 
} 

用同樣的代碼,我可以在數據存儲中沒有寫任何問題,這只是一個存儲問題。

回答

1

查看Google Cloud Storage Errors and Error HandlingService Account文檔。

403表示用戶未被授權發出請求。在你的GCE實例上運行時,我猜你的代碼是在一個服務帳戶中運行的,該服務帳戶對你的存儲桶有寫入權限。在本地運行時,您必須提供相應的憑據才能執行相同的操作。

+0

是的我知道403是什麼意思,但是我可以在本地存儲桶中配置本地ACL,但是我沒有發現任何有關此配置的信息。在例外情況下,有遠程URL POST https://storage.googleapis.com/InstanceName/FileInfos喜歡它嘗試在線上傳。 感謝您的回答 – Benjyyyyy

+0

除此之外,我使用開發服務器憑證連接到本地服務器,我在這裏錯過了什麼?爲什麼此代碼不提供訪問權限? new RemoteApiOptions()。server(server.getAddress(),server.getPort())。useDevelopmentServerCredential(); – Benjyyyyy

0

我想出了爲什麼這不起作用,實際上是通過RemoteAPI調用GCS不寫在本地服務器上,它寫在網上的bucket上。 這就是爲什麼我沒有正確的ACL,我的代碼嘗試連接到雲存儲。 但是現在我不知道如何強制GCSService在本地服務器上寫入。

+0

App Engine支持數據存儲模擬。你確定它支持雲存儲模擬嗎? – jarmod

+0

是的,它在本地環境中使用GCSService時支持雲存儲模擬。就我而言,我們嘗試通過RemoteAPI寫入本地雲存儲,在這種情況下,它不起作用 – Benjyyyyy

相關問題