【问题标题】:Finding a blob in Google AppEngine's BlobStore with BlobKey使用 BlobKey 在 Google AppEngine 的 BlobStore 中查找 blob
【发布时间】:2012-08-17 10:08:21
【问题描述】:

我正在尝试保存并在 GoogleAppEngine 上提供 blob。

// Save the data as a blob
final FileService fileService = FileServiceFactory.getFileService();
final AppEngineFile file = fileService.createNewBlobFile("application/zip", "nameOfSavedFile");
final FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
writeChannel.write(ByteBuffer.wrap(data));
writeChannel.closeFinally();

// Load the blob data
Query query = new Query("__BlobInfo__"); 
query.addFilter("filename", FilterOperator.EQUAL, "nameOfSavedFile"); 
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
PreparedQuery pq = datastore.prepare(query); 
List<Entity> entList = pq.asList(FetchOptions.Builder.withLimit(1)); 
String blobKeyString = entList.get(0).getKey().getName();

BlobstoreService blobStoreService = BlobstoreServiceFactory.getBlobstoreService();
BlobKey blobKeyLoaded = new BlobKey(blobKeyString);
blobStoreService.serve(blobKeyLoaded,response);

如果我运行上面的代码,它似乎可以工作。但是,当我再次运行相同的代码以用同名的新文件覆盖现有文件时,它只会为旧文件提供服务。

谁能解释一下如何用新文件覆盖旧文件?

谢谢!

【问题讨论】:

    标签: java google-app-engine servlets blobstore


    【解决方案1】:

    AFAIK,BlobInfo 仅在您通过 upload handler 上传 blob 时才会生成/更新。

    如果您“手动”更改 blob,即通过 FileService,则不会创建/更新 BlobInfo。在这种情况下,您应该手动更新BlobInfo,或者根本不使用它,而只是将密钥/名称存储在您的自定义实体中。

    【讨论】:

      【解决方案2】:

      如果文件存储在 Blobstore 中,则无法覆盖该文件。

      如果您在创建文件时使用相同的名称,则可以覆盖存储在Google Storage 中的文件。

      【讨论】:

      • 如果我尝试先使用 blobStoreService.delete(blobKeyLoaded); 删除 blob;然后保存一个具有相同文件名的新 blob,然后加载该 blob 我收到此错误:严重:找不到 blob: 有更好的方法吗?
      • 每个新的 blob blobstore blob 都是唯一的键 - 无法避免这种情况。
      猜你喜欢
      • 2011-07-28
      • 2011-07-18
      • 2014-07-23
      • 2014-10-27
      • 1970-01-01
      • 2013-03-06
      • 2012-04-04
      • 2013-03-20
      • 2012-01-19
      相关资源
      最近更新 更多