Google App Engine使用Blobkey

您好,我正在尝试制作一个servlet,允许管理员上传图像和任何谷歌用户查看这些图像,到目前为止,我正在解决https://developers.google.com/appengine/docs/java/blobstore上提供的程序/概述

当我上传一张图片时,它会使用很长的blobKey直接提供它吗? 并将其自身的副本存储在local_db.bin中

我无法找到的是,是否有任何方法可以缩短使用的blobkeys? 例如,我想有一个画廊,显示用户上传的所有图像,但到目前为止,我可以从数据库中获取图像的唯一方法是调用这样的东西

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

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

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

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

谢谢

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

它不是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发送到客户端:

  • 就像一个带有Query参数的@GET资源,比如?filename=whatever
  • 然后,您将从数据存储区中获取与此文件名关联的blobkey

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

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