【发布时间】:2012-04-07 23:38:57
【问题描述】:
我使用 Google Appengine Datastore Blob 来存储图像,但我想改用 Blobstore。我需要将所有现有的 blob 移动到 Blobstore。 使用 GAE for Java 的最佳方法是什么?
【问题讨论】:
标签: java google-app-engine google-cloud-datastore blobstore
我使用 Google Appengine Datastore Blob 来存储图像,但我想改用 Blobstore。我需要将所有现有的 blob 移动到 Blobstore。 使用 GAE for Java 的最佳方法是什么?
【问题讨论】:
标签: java google-app-engine google-cloud-datastore blobstore
AFAIK 没有自动的方法。
您需要:
【讨论】:
我按照 Nick Johnson 的建议使用 MapReduce 解决了这个问题:
检查项目:
http://code.google.com/p/appengine-mapreduce/
Ikai Lan 的精彩教程:
http://ikaisays.com/2010/07/09/using-the-java-mapper-framework-for-app-engine/
这就是 map 方法的样子:
@Override
public void map(Key key, Entity value, Context context) {
log.info("Mapping key: " + key);
try {
Entity picture = value;
if (!picture.hasProperty("blobKey") || picture.getProperty("blobKey") == null) {
String fileName = (String) picture.getProperty("fileName");
String contentType = (String) picture.getProperty("contentType");
Blob image = (Blob) picture.getProperty("image");
if (contentType != null && image != null) {
AppEngineFile file = fileService.createNewBlobFile(contentType,fileName);
FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
writeChannel.write(ByteBuffer.wrap(image.getBytes()));
writeChannel.closeFinally();
BlobKey blobKey = fileService.getBlobKey(file);
picture.setProperty("blobKey",blobKey);
datastore.put(picture);
}
else {
log.log(Level.SEVERE, "Mapping key: " + key + "failed - null contentType or image.");
}
}
} catch (Exception e) {
log.log(Level.SEVERE, "Mapping key: " + key, e);
}
}
【讨论】: