我写了一个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
启用结算并尝试过,仍然没有用:(
一直试图解决这个问题并尝试在任何地方搜索解决方案。
答案 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。
所以,先检查一下显而易见的事情。