Google App Engine 使用 Blobkey

2023-12-02

你好,我正在尝试制作一个 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。

如有任何帮助,我们将不胜感激,请随时询问更多详细信息。

Thanks


我认为你正在以一种有点尴尬的方式处理你的问题。

它为您提供此 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,包括将其文件名保存到数据存储区。

您必须做的另一件事是使用 API 或接口将其从 Blobstore 发送到客户端:

  • Like a @GET具有查询参数的资源,例如?filename=whatever
  • 然后,您将从数据存储中获取与该文件名关联的 blobkey

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google App Engine 使用 Blobkey 的相关文章

  • 如何在Eclipse中集成CSS预处理? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 Eclipse 中编辑 SCSS 文件 最好使用语法突出显示 scss files 我发现这些资
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • Spring Boot自动装配存储库始终为空[重复]

    这个问题在这里已经有答案了 每次我进入我的服务类时 存储库似乎都没有自动连接 因为它不断抛出 NullPointerException 谁能帮我检查一下我缺少什么吗 这是我的代码 演示应用程序 java package com exampl
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 在另一个模块中使用自定义 gradle 插件模块

    我正在开发一个自定义插件 我希望能够在稍后阶段将其部署到存储库 因此我为其创建了一个独立的模块 在对其进行任何正式的 TDD 之前 我想手动进行某些探索性测试 因此 我创建了一个使用给定插件的演示模块 到目前为止 我发现执行此操作的唯一方法
  • Java:如何为山区时间创建 TimeZone 对象?

    必须不禁用夏令时 嗯 在这个清单 http en wikipedia org wiki List of tz database time zones在 zoneinfo 时区名称中 有很多声称是 山地时间 找到最适合您想要的那个 然后使用它
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • Docker 和 Eureka 与 Spring Boot 无法注册客户端

    我有一个使用 Spring Boot Docker Compose Eureka 的非常简单的演示 我的服务器在端口 8671 上运行 具有以下应用程序属性 server port 8761 eureka instance prefer i
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复

随机推荐

  • 表单数据未传递至 PHP

    我有一个简单的表单来将数据传递到 php 页面 形式为
  • php系统、python和utf-8

    我有一个Python程序运行得很好 它连接到多个网站并输出所需的信息 由于并非所有网站都使用 utf 8 进行编码 因此我从标头请求字符集并使用unicode string encoding 解码方法 我不确定它是否是执行此操作的适当方法
  • SCJP - 使用异常处理的重写方法会引发编译器错误

    Kathey Sierra 的 SCJP 书中摘录如下 如果方法被重写但您使用多态 超类型 使用重写方法引用子类型对象的引用 编译器假设您正在调用的超类型版本 方法 如果超类型版本声明了受检查异常 但是 重写子类型方法不会 编译器仍然认为你
  • .Net API 获取互联网时间服务器的准确时间

    我需要知道是否存在任何 NET API 可以从 Internet 时间服务器获取当前时间 以便更改客户端的系统时间不会影响我的应用程序的完整性 你有几个选项 尽管没有内置的 http dotnet snippets com dns simp
  • 将多边形剪辑路径转换为 ​​Microsoft Edge 支持的“clippath”svg 的最简单方法?

    例如 我有一个 css 类 其中应用了多边形剪辑路径 如下所示 services image left webkit clip path polygon 0 0 97 0 83 100 0 100 clip path polygon 0 0
  • 有条件重新启动时增加行计数

    我想在满足现有列中的条件时增加从 1 重新开始的计数 例如我有以下数据框 df lt data frame x1 c 10 100 200 300 87 90 45 80 x2 c start a b c start k l o 我想创建x
  • Heroku 创建了表,但是当我要迁移时,他说没有创建

    我在 Heroku 中创建了syncdb Python Django应用程序 他创建了表south migrationhistory venv project username username projectapp heroku run
  • C++:整数常量对于其类型来说太大

    我需要用一年的时间来进行锻炼 编译器不断抛出此错误 bruteforceJS12 cpp 8 28 警告 整数常量对于其类型来说太大 默认启用 我的代码是 include
  • 发送电子邮件附件中的 CSV 文件

    我有一个问题 我需要创建 csv 文件并将其附加到特定电子邮件中发送 老实说 我从来没有这样做过 所以我在这件事上很糟糕 有人可以告诉我必须开始什么或分享一些链接吗 我认为这就是您正在寻找的 我过去使用过它 效果非常好 希望能帮助到你
  • 在 Spring MVC 控制器中反序列化 json 数组

    我正在发送 json 对象列表并尝试在 Spring 控制器中反序列化它 但我一直收到 错误请求 错误 并导致状态代码为 415 但是 我的 json 数组是有效的 json 是 用户 用户名 约翰 电子邮件 电子邮件受保护 用户id u2
  • 推断 TypeScript 中类型保护的联合类型

    TypeScript 似乎在推断类型保护的联合类型方面存在问题 作为示例 考虑一个将类型保护数组与以下签名组合起来的函数 function combine
  • 在 SIM 卡上读取/写入证书 - iOS

    我正在研究如何使用 SIM 卡中的证书 以便在用户想要更换手机时保持提供的服务 在Android中 似乎没问题 但在iOS平台上我找不到任何东西 是否可以通过iPhone设备从SIM卡读取X 509证书 No 你最好的选择是使用Keycha
  • Google App Engine 标准环境 - 未找到控制器方法 - Spring Boot 应用程序

    我试图在 Google App Engine 标准环境 上部署 Spring Boot 应用程序 首先 我从这个不错的教程中克隆了示例应用程序https springframework guru spring boot web applic
  • IDictionary 是否有 LRU 实现?

    我想实现一个简单的内存中 LRU 缓存系统 并且我正在考虑一个基于 IDictionary 实现的解决方案 该解决方案可以处理散列 LRU 机制 来自java 我有以下经验LinkedHashMap 它可以很好地满足我的需要 我在任何地方都
  • Target.count 导致溢出错误

    I have Worksheet SelectionChange功能 在第一行中 我想要条件是如果选择了超过 1 个单元格 则退出 我写 If Target Cells Count gt 1 Then Exit Sub 但是 当我选择整个工
  • WordPress 分页 - 添加锚链接

    我的index php中有这个锚链接 a a 我希望这个锚链接在单击 next posts link 和 previous posts link 时起作用 这样它就不会一直到达页面顶部 我不知道如何为 WordPress 分页执行此操作 这
  • PHP mongo 查找字段开头为

    我正在尝试为 php mongo 做相当于 mysql 的事情 在我的文章集中找到以 www foo com category 开头的任何链接 我可以在 shell 中很好地执行它 但 php 驱动程序似乎没有正确插入我的命令 而且 mon
  • 如何使用 C# 通过提供文件密码作为参数来解密 pdf 文件?

    我使用以下代码生成了一个带有密码保护的pdf文件 using Stream input new FileStream InputFile FileMode Open FileAccess Read FileShare Read using
  • 如何创建material-ui.js文件?

    我已遵循入门指南并运行示例 但它似乎将示例 lib 文件夹中的所有 js 组件作为单独的资源加载 如何让它构建一个我刚刚从 html 中引用的material ui js 或material ui min js 文件 我是否使用 npm g
  • Google App Engine 使用 Blobkey

    你好 我正在尝试制作一个 servlet 允许管理员上传图像 并允许任何谷歌用户查看这些图像 到目前为止 我正在研究可用的程序https developers google com appengine docs java blobstore