从BlobKey获取Google云端存储文件

时间:2013-08-20 15:32:18

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

我编写了一个Google App Engine应用程序,它利用Blobstore来保存以编程方式生成的数据。为此,我使用了Files API,遗憾的是,该广告已被弃用,以支持Google云端存储。所以我正在重写我的助手类来使用GCS。

我希望保持接口尽可能与以前类似,也因为我在数据存储区中保留BlobKeys以保持对文件的引用(并且更改生产应用程序的模型总是很痛苦)。当我将东西保存到GCS时,我用

检索BlobKey
BlobKey blobKey = blobstoreService.createGsBlobKey("/gs/" + fileName.getBucketName() + "/" + fileName.getObjectName());

按照规定here,我将其保留在数据存储区中。

所以这里有一个问题:文档告诉我如何在servlet响应中使用blobstoreService.serve(blobKey, resp);提供GCS文件,但是如何检索文件内容(如InputStream,字节数组或其他)以便在其中使用它我的代码进一步处理?在我目前的实现中,我使用来自FileReadChannel的{​​{1}}读取(均已弃用)。

4 个答案:

答案 0 :(得分:4)

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

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);

答案 1 :(得分:4)

给定blobKey,使用BlobstoreInputStream类从Blobstore读取值,如documentation中所述:

BlobstoreInputStream in = new BlobstoreInputStream(blobKey); 

答案 2 :(得分:0)

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

  谷歌说:   与BlobInfo元数据不同,FileInfo元数据不会持久化   数据存储。 (也没有blob键,但您可以稍后创建一个   如果需要,可以调用create_gs_key。)您必须保存gs_object_name   你自己在上传处理程序中,否则这些数据将会丢失。

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

答案 3 :(得分:0)

这是Blobstore方法(对不起,这是针对Python的,但我相信你发现它与Java非常相似):

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