当前位置: 首页 > 知识库问答 >
问题:

google app engine java使用blobstore api从云存储检索文件时出错

巫马泰
2023-03-14

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

然后我尝试使用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时,我知道只有两个字段在映射回存储的文件时有用:来自blob key对象的键字符串和文件的实际名称。然而,在云存储中创建的名称/键值是另一个键字符串,似乎与Afaik中的任何内容都不匹配。

现在,如果我从云存储中复制key/name,并通过DataStore查看器将其硬编码到存储FileName/BlobKey映射的对象中,那么一切都正常了!因此,云存储中的引用和我在回调处理程序中获得的引用之间似乎存在脱节。

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

共有1个答案

孟开宇
2023-03-14

我想您在创建blobkey时可能会遇到问题。您的fblob.getBlobKey()已经返回了blobKey,但您尝试将其放入另一个blobKey中。您是否尝试将该密钥传递到BlobStoreReservice.serve方法中:

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

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

 类似资料:
  • 我正在尝试使用谷歌云存储来存储我将在jsp文件中使用的图像。我创建了bucket,上传了一个图像(用于测试),并尝试从java类中检索指向它的Url。我一直收到错误信息 我创造的水桶 我用来检索Url的代码(BUCKETNAME是一个带有bucket名称的静态字符串) 我试着把这张照片公之于众,但没用。我已经看过了各种各样的答案,但我有点不知所措。任何帮助都将不胜感激

  • 我试图在bigquery中创建一个表,从google存储中传输csv。这个csv有3000万行,我得到了这些错误,例如: 读取数据时出错,错误消息:行中从位置2543333656开始的值太多。找到4列,而预期为3列 读取数据时出错,错误消息:行中从位置254312106开始的值太多。找到4列,而预期为3列 这很尴尬,我的csv中没有所有这些行。它在2.5亿行中发现了一个错误。怎么可能?? 非常感谢

  • 我想知道是否有可能从非谷歌App Engine服务器上使用API搜索存储在谷歌云存储中的文件。

  • 问题内容: 如果我有Maven工件信息(GroupId,ArtifactId,版本),我如何以编程方式(使用Java)从本地存储库中检索该Artifact? 具体来说,我需要能够连接到Maven存储库并创建/检索org.apache.maven.artifact.Artifact,以便检索与Artifact相关的文件。 我已经研究了m2e源代码,但是MavenImpl.java(提供Artifac

  • 我正在使用Spring引导连接到谷歌云存储。 我能够连接到一个文件,并从谷歌云存储桶中读取内容。 但是我不能得到谷歌云存储桶中所有文件的列表。 请帮帮我。 这很有效 这不工作。 有什么原因吗?

  • 我在尝试从谷歌云存储下载CSV文件时遇到了一个问题。出于某种原因,它一直以字节而不是可读文本的形式下载文件。当我在Excel中打开下载的CSV时,Excel已经足够智能,可以将其转换为可读文本。我在这里错过了什么?我检查了谷歌的文档,但找不到任何好的信息来完成它们。提前谢谢你! 这是错误:UnicodeDecodeError:“utf-8”编解码器无法解码位置15-16的字节:无效的连续字节