使用blobstore api从云存储检索文件时出现google应用程序引擎java错误
在使用云存储客户端API时,我开始遇到30MB的文件大小限制。经过研究,我发现GAE文档建议我使用BlobStore API 我创建了一个初始测试来上传到我的云服务中的一个bucket。我注意到的一件事是文件名丢失,而是使用了一个键。没什么大不了的,我现在保存blob键和要存储的文件元数据之间的映射 然后,我尝试使用blobstoreService.createGsBlobKey()方法下载该文件。我将通过以下途径: “/gs/”+bucketName+“/”+fBlob.getBlobKey()),其中fBlob是我的映射对象,包含文件信息和blob键 **编辑**我还尝试使用文件的实际名称而不是blob键(我不太确定文档要求的是什么),但结果是相同的 getBlobKey()方法就是这样做的。它返回我从BlobKey.getKeyString()方法检索到的字符串 在我访问传入参数以检索文件的servlet之前,一切似乎都很好。我所有的日志转储看起来都不错。更令人沮丧的是日志中没有任何错误。出现问题的唯一迹象是显示已发生500错误的通用网页,如果我继续遇到此错误,请在支持论坛中发布消息 所以我在这里:) 如蒙协助,将不胜感激。我会提供更多信息(即堆栈跟踪),但正如我提到的,没有任何信息。以下是servlet的摘要:使用blobstore api从云存储检索文件时出现google应用程序引擎java错误,java,google-app-engine,google-cloud-storage,blobstore,Java,Google App Engine,Google Cloud Storage,Blobstore,在使用云存储客户端API时,我开始遇到30MB的文件大小限制。经过研究,我发现GAE文档建议我使用BlobStore API 我创建了一个初始测试来上传到我的云服务中的一个bucket。我注意到的一件事是文件名丢失,而是使用了一个键。没什么大不了的,我现在保存blob键和要存储的文件元数据之间的映射 然后,我尝试使用blobstoreService.createGsBlobKey()方法下载该文件。我将通过以下途径: “/gs/”+bucketName+“/”+fBlob.getBlobKey(
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String iopsKey = request.getParameter("iopsId");
String itemId = request.getParameter("itemId");
String digitalId = request.getParameter("resourceId");
Logger.getAnonymousLogger().info("Site Id: " + iopsKey);
Logger.getAnonymousLogger().info("Item Id: " + itemId);
Logger.getAnonymousLogger().info("Digital Good Id: " + digitalId);
final DigitalResource resource = delegate.getDigitalResource(iopsKey, itemId, digitalId);
Logger.getAnonymousLogger().info("Contents of Digital Resource: " + resource);
FileBlobMap fBlob = delegate.findBLOBByFilename(resource.getInternalName());
Logger.getAnonymousLogger().info("Contents of FileBlogMap: " + fBlob);
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
BlobKey blobKey = blobstoreService.createGsBlobKey("/gs/vendor-imports/" + fBlob.getBlobKey());
blobstoreService.serve(blobKey, response);
}
编辑#2**
在玩了一番之后,我意识到blobstore API生成的键/名称似乎与云存储中实际存储的内容不相关
当使用BlobStoreAPI时,我知道只有两个字段在映射回存储的文件时有用:blob key对象中的key字符串和文件的实际名称。然而,在云存储中创建的名称/键值是另一个键字符串,似乎与AFAIK中的任何内容都不匹配
现在,如果我从云存储中复制key/name,并将其硬编码到通过数据存储查看器存储filename/blobkey映射的对象中,那么一切都正常!因此,在云存储中的引用和我在回调处理程序中得到的内容之间似乎存在着断开连接
已解决**还有一个方法是我使用的FileInfo对象的一部分,我没有注意到。此方法称为getGsObjectName(),它返回一个完全映射的字符串,其中包括“/gs/”前缀以及我在云存储中看到的令牌字符串。这对我来说不是很明显,所以希望这篇文章能在将来节省其他人的时间。我想你在创建blobKey时可能会遇到问题。您的fBlob.getBlobKey()已返回blobKey,但您尝试将其放入另一个blobKey中。您是否尝试将该密钥传递到blobstoreService.serve方法:
blobstoreService.serve(fBlob.getBlobKey(), response);
另外,当出现服务器错误时,您看到的通用页面是AppEngine提供的错误页面。您应该检查控制台是否有任何异常。如果您正在生产环境中运行,您可以查看AppEngine控制台中的日志,以查看错误的详细信息。已解决**我使用的FileInfo对象中还有一个我没有注意到的附加方法。此方法称为getGsObjectName(),它返回一个完全映射的字符串,其中包括“/gs/”前缀以及我在云存储中看到的令牌字符串。这对我来说不是很明显,所以我希望这篇文章能在将来为其他人节省时间
抱歉,如果我的格式设置已关闭,并且我在多个位置都有“解决方案”。这是我第一次发帖,所以我有点超前了。谢谢马尔科沃克萨诺维奇的回复。我存储在fBlob对象中的值是keToString()从原始BlobKey对象返回的值,因此我无法直接传递该值。我确实使用这个字符串值通过BlobKey.createGsBlobKey方法重新创建了BlobKey。坏消息是这也没用。好消息是,我实际上在日志文件中得到了一个错误,指出所有对云存储的引用都必须以gs/开头。至于我发布的其他场景的日志消息……没有。请求似乎已成功通过。那么您现在的状态如何?你还知道这个错误吗,或者这个很好用?好的,我知道了。还有一个方法是我使用的FileInfo对象的一部分,我没有注意到。此方法称为getGsObjectName(),它返回一个完全映射的字符串,其中包括“/gs/”前缀以及我在云存储中看到的令牌字符串。这对我来说不是很明显,所以希望这篇文章能在将来节省其他人的时间。欢迎来到Stack Overflow!如果答案解决了您的问题,请不要忘记将其标记为已接受。因此,如果我需要使用blobstore API处理GCS,我只需使用
datastore.createGsBlobKey(fileinfo.getGSObjectName())获取blobkey代码>?@mb\使用此方法可以获取保存在GCS中的文件的实际链接<代码>fileinfo.getGSObjectName()代码>谢谢,希望这有帮助。