我在服务器(gae)中创建数据,我想将其存储在Blobstore中。我看到很多关于如何做到这一点的答案给客户端提供了一个BlobStore URL,但是没有客户端或HTTP请求:它只是一个异步任务。
然后我想我应该使用createUploadUrl(),而不是将此URL提供给客户端,而不是通过我的代码HTTP将我的数据通过URL Fetch发布到它。这看起来很奇怪,是不是还有其他API?
假设我在Blobstore中想要的文件已存储在我的GCS默认存储桶中。我可以使用gcs位置“/ gs / bucketname / file”告诉Blobstore他们吗?我试过
GcsFilename filename = new GcsFilename(bucketName, fileId);
String gcsKey = "/gs/" + bucketName + "/" + filename.getObjectName();
BlobKey blobKey = blobstoreService.createGsBlobKey(gcsKey);
GcsOutputChannel outputChannel = gcsService.createOrReplace(filename, GcsFileOptions.getDefaultInstance());
ObjectOutputStream oout = new ObjectOutputStream(Channels.newOutputStream(outputChannel));
oout.writeObject(myDataObjectToPersist);
oout.close();
// ...at some other point I have checked the file is correctly stored in
// GCS and I can fetch it using /gs/bucket/fileId
// but it doesn't seem to be in Blobstore, so when
InputStream stream = new BlobstoreInputStream(new BlobKey(blobKey.keyString))
// ... this gives a BlobstoreInputStream$BlobstoreIOException: BlobstoreInputStream received an invalid blob key...
这在概念上是错误的 - 就像我使用GcsOutputChannel来保存它一样,即使我创建一个BlobKey,我也不会从Blobstore获取它,或者它是否可以工作但是我做错了什么?
1K谢谢
答案 0 :(得分:1)
为什么要将文件存储在blobstore中而不是直接从GCS写入和读取文件?
是的,您可以为存储在GCS中的文件创建BlobKey,并且可以在某些blobstore API中使用该密钥(例如fetchData和serve),但遗憾的是并非全部。 某些blobstore API(例如BlobstoreInputStream)依赖于BlobInfo,并且在使用GCS客户端时不会创建。