从BlobKey获取Google Cloud Storage文件

6
我编写了一个谷歌应用引擎应用程序,利用Blobstore存储以编程方式生成的数据。为此,我使用了文件API,但不幸的是,该API已被弃用,而改用Google Cloud Storage。因此,我正在重写我的辅助类以便使用GCS。
我希望保持接口尽可能与之前相似,也因为我在Datastore中持久化BlobKeys以保留对文件的引用(更改生产应用程序的模型总是很痛苦的)。当我将某些内容保存到GCS时,我会检索一个BlobKey。
BlobKey blobKey = blobstoreService.createGsBlobKey("/gs/" + fileName.getBucketName() + "/" + fileName.getObjectName());

按照此处指定的方法,我将数据保留在Datastore中。
那么问题来了:文档告诉我如何使用blobstoreService.serve(blobKey, resp);在servlet响应中服务GCS文件,但是我该如何检索文件内容(以InputStream、byte数组或其他方式),以便在我的代码中进行进一步处理?在我的当前实现中,我使用从AppEngineFile中读取的FileReadChannel(已弃用)。
4个回答

4

给定一个 blobKey,使用 BlobstoreInputStream 类从 Blobstore 中读取值,如 文档 中所述:

BlobstoreInputStream in = new BlobstoreInputStream(blobKey); 

4

以下是打开Google Storage Object作为输入流的代码。不幸的是,您必须使用存储桶名称和对象名称,而不是 blob key。

GcsFilename gcs_filename = new GcsFilename(bucket_name, object_name);
GcsService service = GcsServiceFactory.createGcsService();
ReadableByteChannel rbc = service.openReadChannel(gcs_filename, 0);
InputStream stream = Channels.newInputStream(rbc);

谢谢!我本来希望使用BlobKey获取内容,但如果没有办法的话,我将(呃)重构我的模型以包含对象名称。 - Skice

0

这里是Blobstore方法(抱歉,这是针对Python的,但我相信你会发现它在Java中非常相似):

blob_reader = blobstore.BlobReader(blob_key)
if blob_reader:
  file_content = blob_reader.read()

0

您只能在上传处理程序中获取云存储文件名(fileInfo.gs_object_name),然后将其存储到数据库中。之后,该文件名将丢失,并且似乎不会保存在BlobInfo或其他元数据结构中。

谷歌表示: 与BlobInfo元数据不同,FileInfo元数据不会保留到数据存储中(也没有blob key,但如果需要,您可以稍后通过调用create_gs_key来创建一个)。您必须在上传处理程序中自行保存gs_object_name,否则这些数据将丢失。

抱歉,这是一个Python链接,但在Java中应该很容易找到类似的内容。 https://developers.google.com/appengine/docs/python/blobstore/fileinfoclass


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接