Google App Engine使用Blobkey

时间:2013-03-29 14:01:44

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

您好我正在尝试制作一个允许管理员上传图片的servlet以及任何谷歌用户查看这些图片,到目前为止我正在使用https://developers.google.com/appengine/docs/java/blobstore/overview

的程序。

当我上传图片时,它使用非常长的blobKey直接提供它?并在local_db.bin

中存储自己的副本

我无法找到的是,是否有任何方法可以缩短blobkeys的使用时间?例如,我希望有一个画廊,显示用户上传的所有图像,但到目前为止,我从数据库中获取图像的唯一方法是通过调用此类内容

res.sendRedirect(“/ serve?blob-key =”+ blobKey.getKeyString())

但这仅适用于一个图像,我需要对每个新的blobKey进行硬编码,以便在单独的页面上显示它,这也意味着当用户上传新图像时,我将不得不编辑代码并添加新的链接对于新形象?

基本上我想知道的是,无论如何都可以轻松定义存储在local_db.bin中的每个blob。

任何帮助将不胜感激,请不要犹豫,询问更多细节。

由于

1 个答案:

答案 0 :(得分:0)

我认为你正以一种稍微尴尬的方式接近你的问题。

它不是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的内容,包括将其文件名保存到数据存储区。

您需要做的另一件事是您的API或界面将其从Blobstore发送到客户端:

  • 类似于@GET资源,其查询参数如?filename=whatever
  • 然后,您将从数据存储区中获取与此文件名相关联的blobkey

这只是一个简化的示例,您必须确保在需要时将Filename和Blobkey保存在正确的容器和用户中。

您可以直接使用Blobstore API和Image API,但如果需要进一步控制,则必须设计自己的API。不管怎么说,Apache Jersey和JBoss Resteasy与GAE完美配合。