使用Google Endpoint保存blob

时间:2014-03-03 18:00:16

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

我有一个应用程序,允许用户在blobstore中保存blob。我有一个目前这样做的架构,但我对更简单,更少扭曲的东西感兴趣。对于上下文,想象一下我的应用程序允许用户上传动物的图片,其中有一段描述动物正在做什么。

目前架构

  1. 用户调用我的端点api,以保存实体paragraph中动物的nameAnimal注意: Animal实体实际上有4个字段(nameparagraphBlobKeyblobServingUrl为字符串)。但是端点api只允许保存上面提到的两个。

  2. 在端点方法中,在app-engine端,保存nameparagraph后,我进行以下调用以生成blob服务url,我的端点方法返回给调用者

    @ApiMethod(name =“saveAnimalData”,httpMethod = HttpMethod.POST)     public String saveAnimalData(AnimalData request)抛出异常{ ... BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();         String url = blobstoreService.createUploadUrl(“/ upload”); 返回网址; }

  3. 在android方面,我使用普通的http调用将图像的byte []发送到blobstore。我使用apache DefaultHttpClient()注意: blobstore在保存图片后,使用blob密钥和服务网址调用我的app-engine服务器

  4. 我使用普通的java servlet(即public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException)读取blobstore(blobstore,名为my callback url)的响应。在servlet中,我将BlobKeyblobServingUrl放入相关动物的Animal实体中。 (我已经将一些元数据传递给了blobstore,我用它作为标记来识别相关的动物实体)。

  5. 所需架构

    这是你的回复所在。基本的,我想消除java servlet并让我的整个api仅限于google cloud端点。所以我的问题是:我如何使用我的端点执行第3步和第4步?

    因此,我的想法是在发送saveAnimalDataparagraph数据的同时将图像字节发送到端点方法name。然后在端点方法中,将图像发送到blobstore,然后将BlobKeyblobServingUrl保留在我的实体Animal中。

    您的回复必须是java。感谢。

1 个答案:

答案 0 :(得分:1)

我在这里看到两个问题:

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

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

  3. 取决于图像的大小。如果您将用户限制为< 1MB文件,您只需将图像存储为Blob实体的Animal属性即可。这将允许您绕过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使用了文件系统。