我认为你正在以一种有点尴尬的方式处理你的问题。
它不是 Blobstore 问题,它为您提供了此 blob 密钥。你可以做的是:
- 创建上传 servlet 以捕获文件上传
- 使用 AppEngine File API 获取字节并存储它
在这里,让我向您展示(我的项目中的工作代码块):
@POST
@Consumes("multipart/form-data")
@Path("/databases/{dbName}/collections/{collName}/binary")
@Override
public Response createBinaryDocument(@PathParam("dbName") String dbName,
@PathParam("collName") String collName,
@Context HttpServletRequest request, @Context HttpHeaders headers,
@Context UriInfo uriInfo, @Context SecurityContext securityContext) {
try {
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator fileIterator = upload.getItemIterator(request);
while (fileIterator.hasNext()) {
FileItemStream item = fileIterator.next();
if ("file".equals(item.getFieldName())){
byte[] content = IOUtils.toByteArray(item.openStream());
logger.log(Level.INFO, "Binary file size: " + content.length);
logger.log(Level.INFO, "Mime-type: " + item.getContentType());
String mimeType = item.getContentType();
FileService fileService = FileServiceFactory.getFileService();
AppEngineFile file = fileService.createNewBlobFile(mimeType);
String path = file.getFullPath();
file = new AppEngineFile(path);
boolean lock = true;
FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock);
writeChannel.write(ByteBuffer.wrap(content)); // This time we write to the channel directly
writeChannel.closeFinally();
BlobKey blobKey = fileService.getBlobKey(file);
} else if ("name".equals(item.getFieldName())){
String name=IOUtils.toString(item.openStream());
// TODO Add implementation
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
正如您所看到的,Blobstore 只是提供“图像”的一部分,您必须自己创建一个 API 或其他东西,以便将这些图像或任何二进制数据获取到 Blobstore,包括将其文件名保存到 Datastore。
您必须做的另一件事是您的 API 或接口,以便将其从 Blobstore 导出到客户端:
- 像
@GET
具有查询参数的资源一样?filename=whatever
- 然后,您将从数据存储中获取与此文件名关联的 blobkey
这只是一个简化的示例,您必须确保保存 Filename 和 Blobkey,也就是说,如果需要,保存在正确的容器和用户中。
您可以直接使用 Blobstore API 和 Image API,但如果需要进一步控制,则必须设计自己的 API。无论如何,它并不难,Apache Jersey 和 JBoss Resteasy 与 GAE 完美配合。