谷歌应用程序引擎使用的blobKey(Google App Engine Use Blobkey)

2019-08-18 05:59发布

您好我试图做一个servlet,允许管理员上传图像和任何谷歌用户查看这些图片,工作关可得的节目至今IM在https://developers.google.com/appengine/docs/java/blobstore /概述

当我上传一张图片,它提供它马上用很长的blobKey? 和存储本身的是local_db.bin副本

我无法找出是,如果有任何的方式来缩短使用blobkeys? 比如我想有它显示已上传用户的所有图像画廊,但到目前为止,我可以从数据库中的图像的唯一方法是调用像这样

res.sendRedirect( “/服务?团块键=” + blobKey.getKeyString())

但这仅适用于一个形象,我需要硬编码每一个新的blobKey,以显示它一个单独的页面上,当用户上传一个新的形象,我将不得不修改代码并添加新的链接新也意图片?

基本上我想了解一下什么是是否有无论如何轻松定义存储在是local_db.bin每个斑。

任何帮助将非常感激,请不要犹豫,要求更多的细节。

谢谢

Answer 1:

我觉得你是在一个略显尴尬的方式接近你的问题。

它不是Blob存储问题,它给你这个blob键。 你可以做的是:

  • 创建一个上传的servlet捕捉文件上传
  • 获取字节,并将其存储使用AppEngine上文件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;
}

正如你所看到的Blob存储仅仅是一个服务的“影像”的一部分,你必须让自己的API或东西,将让这些图片或任何二进制数据Blob存储区,包括它的文件名保存到数据存储。

你所要做的另一件事情是你的API或接口从Blob存储到客户端把它弄出来:

  • @GET与查询参数资源一样?filename=whatever
  • 然后你会从数据库中获取与此相关的文件名中的BlobKey

这只是一个简单的例子,你必须确保你保存文件名和类BlobKey,即在合适的容器中,用户如果需要的。

您可以直接使用Blob存储API和图像API,但如果您需要进一步的控制,你必须设计自己的API。 它并不难,无论如何,Apache的球衣和JBoss RestEasy的完美支援GAE。



文章来源: Google App Engine Use Blobkey