【问题标题】:Saving blobs with Google Endpoint使用 Google Endpoint 保存 Blob
【发布时间】:2014-04-04 22:09:09
【问题描述】:

我有一个允许用户在 blobstore 中保存 blob 的应用。我有一个目前可以这样做的模式,但我对更简单且不那么扭曲的东西感兴趣。对于上下文,想象一下我的应用程序允许用户上传动物的图片,并附上一段描述动物正在做什么的段落。

当前架构

  1. 用户调用我的端点 api 将动物的 paragraph 和 name 保存在实体 Animal 中。 注意: Animal 实体实际上有 4 个字段(name、paragraph、BlobKey 和 blobServingUrl 作为字符串)。但是端点 api 只允许保存提到的两个。

  2. 在应用程序引擎端的端点方法中,保存name 和paragraph 后,我进行以下调用以生成一个blob 服务url,我的端点方法将其返回给调用者

    @ApiMethod(name = "saveAnimalData", httpMethod = HttpMethod.POST) 公共字符串保存动物数据(动物数据请求)抛出异常 { ... BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); 字符串 url = blobstoreService.createUploadUrl("/upload"); 返回网址; }

  3. 在 android 端,我使用普通的 http 调用将图像的 byte[] 发送到 blobstore。我使用 apache DefaultHttpClient()。 注意: blobstore 保存图像后,使用 blob 密钥和服务 url 调用我的应用引擎服务器

  4. 我使用普通的 java servlet (即public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException)从 blobstore(blobstore 称为我的回调 url)读取响应。在 servlet 中,我将 BlobKey 和 blobServingUrl 放入关联动物的 Animal 实体中。 (我已将一些元数据传递给 blobstore,我将其用作标识相关动物实体的标记)。

所需架构

这就是您的响应的来源。重要的是,我想消除 java servlet 并将我的整个 api 限制为谷歌云端点。所以我的问题是:我将如何使用我的端点来执行步骤 3 和 4?

所以我的想法是在发送paragraph 和name 数据的同时将图像字节发送到端点方法saveAnimalData。然后在端点方法中,将图像发送到 blobstore,然后将BlobKey 和blobServingUrl 持久化到我的实体Animal 中。

您的回复必须是 java 格式。谢谢。

【问题讨论】:

  • 嘿!我使用与您相同的过程,但我有一个问题。在我的success_path servlet 中,getUploads(req) 方法返回一个空对象。所以我没有任何blobket 或blobServingUrl。你知道怎么了??谢谢

标签: java google-app-engine google-cloud-datastore google-cloud-endpoints blobstore


【解决方案1】:

我在这里看到两个问题:

  1. Google Cloud Endpoints 可以处理多部分文件吗? -> 我不知道这个 TBH

  2. 有没有比使用 BlobStoreService 更简单的存储 blob 的过程?

这取决于图像的大小。如果您将用户限制为小于 1MB 的文件,则可以将图像存储为 Animal 实体的 Blob 属性。它可以让你绕过BlobStoreService 管道。见:https://developers.google.com/appengine/docs/java/datastore/entities?hl=FR

此解决方案仍取决于 Cloud Endpoint 如何将多部分文件作为原始 byte[]...

我们在 2009 年使用 GWT + Google App Engine 时遇到了同样的问题,那是在 BlobStoreService 可用之前。

GWT RPC 和 Cloud Endpoints 接口有一些相似之处,对我们来说这是不可能的。我们必须创建一个普通的 HTTP Servlet,并使用 Streaming Multipart 文件解析器,因为来自 Apache 的 HTTP Commons 的解析器使用了文件系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2014-02-16
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    相关资源
    最近更新 更多