【问题标题】:Google App Engine Use BlobkeyGoogle App Engine 使用 Blobkey
【发布时间】:2013-03-20 05:56:09
【问题描述】:

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

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

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

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

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

基本上我想知道的是是否可以轻松定义存储在 local_db.bin 中的每个 blob。

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

谢谢

【问题讨论】:

  • 您可以使用 GAE 提供的图像服务 api 来提供来自 GAE 的图像。在这篇文章中查看我的解决方案stackoverflow.com/questions/15306790/…
  • @user2216137 我的回答有帮助吗?

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


【解决方案1】:

我认为您处理问题的方式有点尴尬。

它为您提供此 blob 密钥不是 Blobstore 问题。你可以做的是:

  • 创建上传 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

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

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

【讨论】:

    猜你喜欢
    • 2013-10-08
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多