我编写了一个Google App Engine应用程序,它利用Blobstore来保存以编程方式生成的数据。为此,我使用了Files API,遗憾的是,该广告已被弃用,以支持Google云端存储。所以我正在重写我的助手类来使用GCS。
我希望保持接口尽可能与以前类似,也因为我在数据存储区中保留BlobKeys以保持对文件的引用(并且更改生产应用程序的模型总是很痛苦)。当我将东西保存到GCS时,我用
检索BlobKeyBlobKey blobKey = blobstoreService.createGsBlobKey("/gs/" + fileName.getBucketName() + "/" + fileName.getObjectName());
按照规定here,我将其保留在数据存储区中。
所以这里有一个问题:文档告诉我如何在servlet响应中使用blobstoreService.serve(blobKey, resp);
提供GCS文件,但是如何检索文件内容(如InputStream,字节数组或其他)以便在其中使用它我的代码进一步处理?在我目前的实现中,我使用来自FileReadChannel
的{{1}}读取(均已弃用)。
答案 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()