6

我编写了一个 Google App Engine 应用程序,它使用 Blobstore 来保存以编程方式生成的数据。为此,我使用了Files API,不幸的是,它已被弃用,取而代之的是 Google Cloud Storage。所以我正在重写我的助手类以使用 GCS。

我希望界面尽可能与以前相似,因为我将 BlobKeys 保留在 Datastore 中以保留对文件的引用(并且更改生产应用程序的模型总是很痛苦)。当我将某些内容保存到 GCS 时,我使用

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

按照这里的规定,我将它保存在数据存储区中。

所以这里的问题是:文档告诉我如何blobstoreService.serve(blobKey, resp);在 servlet 响应中提供 GCS 文件,但是如何检索文件内容(如 InputStream、字节数组或其他)以在我的代码中使用它以进行进一步处理?在我当前的实现中,我通过FileReadChannel读取AppEngineFile(均已弃用)来做到这一点。

4

4 回答 4

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);
于 2013-08-20T16:22:52.540 回答
4

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

BlobstoreInputStream in = new BlobstoreInputStream(blobKey); 
于 2014-02-12T15:45:21.287 回答
0

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

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

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

于 2013-10-28T14:43:43.577 回答
0

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

blob_reader = blobstore.BlobReader(blob_key)
if blob_reader:
  file_content = blob_reader.read()
于 2015-07-09T09:33:55.283 回答