我使用GCSService在GoogleCloudStorage存储桶中写入文件,所有这些都适用于在线实例,但是当我想在我的本地开发服务器上测试我的代码时,就不可能在存储桶中写入(模拟本地存储桶,如数据存储区) )。 额外的困难我尝试用胖客户端的远程API在我的本地服务器上写,我在网上搜索我找不到我的答案。 当我调用createOrUpdate()方法时,我有这个例外:
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();
}
使用相同的代码,我可以毫无问题地在DataStore中编写,这只是存储问题。
答案 0 :(得分:1)
请参阅Google Cloud Storage Errors and Error Handling和Service Account文档。
403表示用户无权发出请求。在GCE实例上运行时,我猜测您的代码是在对您的存储桶具有写入权限的服务帐户中运行的。在本地运行时,您必须提供相应的凭据才能执行相同的操作。
答案 1 :(得分:0)
我弄清楚为什么这不起作用,实际上通过RemoteAPI调用GCS不会在本地服务器上写入,它会写在在线存储桶上。 这就是为什么我没有正确的ACL,我的代码尝试连接到云存储。 但现在我不知道如何强制GCSService在我的本地服务器上写入。