【问题标题】:google app engine java error using blobstore api to retrieve file from cloud storagegoogle app engine java错误使用blobstore api从云存储中检索文件
【发布时间】:2014-01-01 22:28:18
【问题描述】:

在使用云存储客户端 API 时,我开始遇到 30MB 文件大小的限制。经过研究,我发现 GAE 文档建议我使用 BlobStore API。

我创建了一个初始测试以上传到我的云服务中的存储桶。我注意到的一件事是文件名丢失了,而是使用了一个密钥。没什么大不了的,我现在持久化 blob 键和我要存储的文件元数据之间的映射。

然后我尝试使用 blobstoreService.createGsBlobKey() 方法下载文件。我正在传递以下内容: "/gs/" + bucketName + "/" + fBlob.getBlobKey()) 其中 fBlob 是我的映射对象,包含文件信息和 blob 键。

** 编辑 ** 我也尝试使用文件的实际名称而不是 blob 键(我不太确定文档要求什么),但结果是一样的。

getBlobKey() 方法就是这样做的。它返回我从 BlobKey.getKeyString() 方法中检索到的字符串。

在我访问传入参数以检索文件的 servlet 之前,一切似乎都很好。我所有的日志转储看起来都不错。更令人沮丧的是日志中没有任何错误。存在问题的唯一迹象是显示出现 500 错误的通用网页,如果我继续遇到此错误,请在支持论坛中发布消息。

所以我在这里:)

任何帮助将不胜感激。我会提供更多信息(即堆栈跟踪),但正如我所提到的,没有任何信息。以下是 servlet 的摘要:

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 生成的密钥/名称似乎与云存储中实际存储的内容不相关。

当使用 blobstore api 时,我知道只有 2 个字段可用于映射回存储的文件:来自 blob 键对象的键字符串和文件的实际名称。但是,在云存储中创建的名称/键值是另一个键字符串,似乎与任何 AFAIK 都不匹配。

现在,如果我从云存储中复制密钥/名称并将其硬编码到通过 DataStore 查看器存储文件名/blobkey 映射的对象中,那么一切正常!因此,云存储中的引用与我在回调处理程序中得到的内容之间似乎存在脱节。

已解决 ** 我使用的 FileInfo 对象中还有一个我没有注意到的附加方法。此方法称为 getGsObjectName(),它返回一个完全映射的字符串,其中包含“/gs/”前缀以及我在云存储中看到的令牌字符串。这对我来说并不是很明显,所以希望这篇文章将来可以节省其他人的时间。

【问题讨论】:

  • 欢迎来到 Stack Overflow!如果它解决了您的问题,请不要忘记将答案标记为已接受

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


【解决方案1】:

我认为您在创建 blobKey 时可能会遇到问题。您的 fBlob.getBlobKey() 已经返回 blobKey,但随后您尝试将其放入另一个 blobKey。您是否尝试将该密钥传递给 blobstoreService.serve 方法:

blobstoreService.serve(fBlob.getBlobKey(), response);

此外,您看到的通用页面是出现服务器错误时 AppEngine 提供的错误页面。您应该检查您的控制台是否有任何异常。如果您在生产环境中运行,您可以在 AppEngine 控制台中查看日志以查看错误的详细信息。

【讨论】:

  • 感谢马尔科夫克萨诺维奇的回复。我存储在 fBlob 对象中的值是 keToString() 从原始 BlobKey 对象返回的值,因此我无法直接将其传入。我确实使用此字符串值通过 BlobKey.createGsBlobKey 方法重新创建了 BlobKey。坏消息是这也不起作用。好消息是,我实际上在日志文件中发现了一个错误,表明所有对云存储的引用都必须以 gs/ 开头。至于我发布的其他场景的日志消息……没有。请求看起来一切顺利。
  • 那么您现在的状态如何?您是否仍然收到错误或这工作正常?
  • 好的,我想通了。还有一个我没有注意到的附加方法,它是我正在使用的 FileInfo 对象的一部分。此方法称为 getGsObjectName(),它返回一个完全映射的字符串,其中包含“/gs/”前缀以及我在云存储中看到的令牌字符串。这对我来说并不是很明显,所以希望这篇文章将来可以节省其他人的时间。
【解决方案2】:

已解决 ** 我使用的 FileInfo 对象中还有一个我没有注意到的附加方法。此方法称为 getGsObjectName(),它返回一个完全映射的字符串,其中包含“/gs/”前缀以及我在云存储中看到的令牌字符串。这对我来说并不是很明显,所以希望这篇文章将来可以节省其他人的时间。

很抱歉,如果我的格式已关闭,并且我在多个地方都有“解决方案”这一事实。这是我第一次发帖,我有点超前了。

【讨论】:

  • 嗨,所以如果我需要使用 blobstore API 处理 GCS,我只需使用 datastore.createGsBlobKey(fileinfo.getGSObjectName()); 获取 blobkey ?
  • @mb_ 您可以使用此方法获取保存在 GCS 中的文件的实际链接。 fileinfo.getGSObjectName(); 谢谢,希望对您有所帮助。
猜你喜欢
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 2020-03-09
  • 2014-04-20
  • 1970-01-01
  • 2011-11-11
相关资源
最近更新 更多