我有一个应用程序,允许用户在blobstore中保存blob。我有一个目前这样做的架构,但我对更简单,更少扭曲的东西感兴趣。对于上下文,想象一下我的应用程序允许用户上传动物的图片,其中有一段描述动物正在做什么。
目前架构
用户调用我的端点api,以保存实体paragraph
中动物的name
和Animal
。 注意: Animal
实体实际上有4个字段(name
,paragraph
,BlobKey
和blobServingUrl
为字符串)。但是端点api只允许保存上面提到的两个。
在端点方法中,在app-engine端,保存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密钥和服务网址调用我的app-engine服务器
我使用普通的java servlet(即public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
)读取blobstore(blobstore,名为my callback url)的响应。在servlet中,我将BlobKey
和blobServingUrl
放入相关动物的Animal
实体中。 (我已经将一些元数据传递给了blobstore,我用它作为标记来识别相关的动物实体)。
所需架构
这是你的回复所在。基本的,我想消除java servlet并让我的整个api仅限于google cloud端点。所以我的问题是:我如何使用我的端点执行第3步和第4步?
因此,我的想法是在发送saveAnimalData
和paragraph
数据的同时将图像字节发送到端点方法name
。然后在端点方法中,将图像发送到blobstore,然后将BlobKey
和blobServingUrl
保留在我的实体Animal
中。
您的回复必须是java。感谢。
答案 0 :(得分:1)
我在这里看到两个问题:
Google Cloud Endpoints可以处理多部分文件吗? - > 我不知道这个TBH
存储blob的过程比使用BlobStoreService
更简单吗?
取决于图像的大小。如果您将用户限制为< 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使用了文件系统。