我有一个允许用户在 blobstore 中保存 blob 的应用程序。我有一个目前这样做的模式,但我对更简单、更少扭曲的东西感兴趣。对于上下文,假设我的应用程序允许用户上传动物图片,并用一段描述动物正在做什么。
当前架构
用户调用我的端点 api 以将动物的
paragraph
和name
保存在实体Animal
中。 注意:Animal
实体实际上有 4 个字段(name
、paragraph
、BlobKey
和blobServingUrl
作为字符串)。但是端点 api 只允许保存提到的两个。在端点方法中,在应用程序引擎端,在保存
name
和paragraph
之后,我进行以下调用以生成一个 blob 服务 url,这是我的端点方法返回给调用者@ApiMethod(name = "saveAnimalData", httpMethod = HttpMethod.POST) public String saveAnimalData(AnimalData request) 抛出异常{ ... BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); String url = blobstoreService.createUploadUrl("/upload"); 返回网址;
在 android 端,我使用普通的 http 调用将图像的 byte[] 发送到 blobstore。我使用 apache
DefaultHttpClient()
。 注意:保存图片后,blobstore 会使用 blob key 和服务 url 调用我的应用引擎服务器我使用普通的 java servlet 从 blobstore(blobstore 称为我的回调 url)读取响应,即
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
。在 servlet 中,我将BlobKey
和blobServingUrl
放入相关动物的Animal
实体中。 (我已经将一些元数据传递到 blobstore,我将其用作标记来识别相关的动物实体)。
所需架构
这就是您的回应所在。重要的是,我想消除 java servlet 并将我的整个 api 限制为谷歌云端点。所以我的问题是:我将如何使用我的端点来执行步骤 3 和 4?
所以我的想法是在发送 paragraph
和 name
的同时将图像字节发送到端点方法 saveAnimalData
> 数据。然后在端点方法中,将图像发送到 blobstore,然后将 BlobKey
和 blobServingUrl
保存在我的实体 Animal
中。
您的回复必须使用 Java。谢谢。
最佳答案
我在这里看到两个问题合二为一:
Google Cloud Endpoints 可以处理多部分文件吗? -> 我不知道这个 TBH
有没有比使用
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 接口(interface)有一些相似之处,对我们来说这是不可能的。我们必须创建一个普通的 HTTP Servlet,并使用流式多部分文件解析器,因为来自 Apache 的 HTTP Commons 的解析器使用了文件系统。
关于java - 使用 Google Endpoint 保存 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22153910/