服务器端上传到Blobstore - Java Google Appengine

时间:2015-11-04 01:01:52

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

我在服务器(gae)中创建数据,我想将其存储在Blobstore中。我看到很多关于如何做到这一点的答案给客户端提供了一个BlobStore URL,但是没有客户端或HTTP请求:它只是一个异步任务。

  1. 然后我想我应该使用createUploadUrl(),而不是将此URL提供给客户端,而不是通过我的代码HTTP将我的数据通过URL Fetch发布到它。这看起来很奇怪,是不是还有其他API?

  2. 假设我在Blobstore中想要的文件已存储在我的GCS默认存储桶中。我可以使用gcs位置“/ gs / bucketname / file”告诉Blobstore他们吗?我试过

  3. 
    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谢谢

1 个答案:

答案 0 :(得分:1)

为什么要将文件存储在blobstore中而不是直接从GCS写入和读取文件?

是的,您可以为存储在GCS中的文件创建BlobKey,并且可以在某些blobstore API中使用该密钥(例如fetchDataserve),但遗憾的是并非全部。 某些blobstore API(例如BlobstoreInputStream)依赖于BlobInfo,并且在使用GCS客户端时不会创建。