尝试获取存储在GCS中的图像的getServingUrl时的OBJECT_NOT_FOUND

时间:2014-05-10 15:08:14

标签: java google-app-engine servlets google-cloud-storage

我写了一个Servlet,我正在从blobstore读取图像,另一个图像来自GCS,然后在这两个图像上应用复合后,我将合成图像存储回GCS。

我的代码在这里工作得很好。

之后,当我尝试获取合成图像的服务网址时,我得到OBJECT_NOT_FOUND

只是为了实验我在GCS中手动上传了一张图片,并提供了所有必要的权限。将serviceaccount添加为OWNER,并为所有用户提供READ访问权限。然后我再次尝试获取服务网址。以下是我的代码: -

BlobKey newImageKey = blobstoreService.createGsBlobKey(gcsPath);
//log.severe("GCS PATH: " + gcsPath + " BlobKey: " + newImageKey);

ServingUrlOptions options = ServingUrlOptions.Builder.withBlobKey(newImageKey);
String profilePicLink = imgService.getServingUrl(options);

我也尝试了以下代码: -

ServingUrlOptions options = ServingUrlOptions.Builder.withGoogleStorageFileName(gcsPath);
String profilePicLink = imgService.getServingUrl(options);

在这两种情况下,这都是我得到的错误:

  

/ controller javax.servlet.ServletException:   java.lang.IllegalArgumentException:OBJECT_NOT_FOUND:

顺便说一下,我没有启用结算功能,因为我使用的是带有免费配额的默认存储桶。这仍在开发中,所以免费配额对我有用。

好的,所以我发现了异常发生的地方......

byte [] responseBytes = ApiProxy.makeSyncCall(PACKAGE," GetUrlBase",            。request.build()toByteArray());

它抛出的例外是:

ApiProxy.ApplicationException应用程序错误8

启用结算并尝试过,仍然没有用:(

一直试图解决这个问题并尝试在任何地方搜索解决方案。

4 个答案:

答案 0 :(得分:1)

虽然这实际上没有回答我原来的问题,但我找到了解决方法。我安装了python和gsutil,并设置了我的桶的默认acl来读取。现在,当我在GCS中保存图像文件时,我只是显示公共URL链接。

如果在GCSFileOptions中添加.acl(“public-read”),也可以实现上述目的。

通过以上两种方法之一应用acl后,在GCS云控制台中,您可以看到公开链接的图像复选框以短划线显示,并且表示您无权编辑权限。我很难看到它,因为我期待复选框被检查。

但即使在上述情况下,公开共享链接仍然有效: -

http://storage.googleapis.com/[bucket_name]/[gcs_object_name]

如果有人能解释为什么getServingUrl不能正常工作,我仍然会感激。是的,在设置默认acl后,它仍然无法正常工作。

谢谢, Sukalpo。

答案 1 :(得分:0)

我无法通过控制台或App Engine GCS Java客户端上传到Google云端存储来重现此问题。在这两种情况下,我都可以为图像创建公共URL 即使没有指定任何特定权限。

是否要创建生产问题请求, https://code.google.com/p/googleappengine/issues/entry?template=Production%20issue ,我们可以获得有关您具体案例的更多详细信息吗?

答案 2 :(得分:0)

你的gcsPath是什么?我必须使用:

"/gs/" + gcsFileName.getBucketName() + "/" + gcsFileName.getObjectName();

答案 3 :(得分:0)

老实说,我遇到这个错误的唯一方法(遇到这个未解决的问题)就是当我意外地以难以察觉的方式使用错误的文件名时BlobKey使用谷歌的API。

所以,先检查一下显而易见的事情。