[英]Can I save images to Blobstore and save data to Datastore in one trip?
已经在许多场合提出并解决了这个论点:Blobstore在存储图像方面比DataStore更好。 现在说我有一个类似于Instagram或Facebook或Yelp的应用程序,或者其中任何一个图像密集型应用程序。 在我的情况下,理想的模型是
public class IdealPostModel{
Integer userId;
String synopsys;
Blob image;
...//more data/fields about the post
}
但是由于必须使用BlobStore,因此我的模型没有blob,而是URL或BlobKey。 最棘手的问题是,要发送帖子(即将帖子保存到服务器),应用必须按该顺序-
BlobstoreUtils.generateServingUrl(null)
数据 握手很多!!!
有没有一种方法可以在第一步中将所有数据发送到服务器:字符串和图像。 然后服务器从那里进行其他所有操作? 当然,我希望减少工作量。 我认为App Engine到现在必须已经相当成熟,而且必须有比我的架构更简单的方法。
现在,我当然在这里,因为我遇到了保存数据但BlobKey或URL未保存到实体的情况。 大约有10%的时间发生。 或许更少,但确实有10%的感觉。 这让我的用户疯狂,这意味着让我更加疯狂,因为我不想失去我的用户。
理想的情况下
更新
public static String generateServingUrl(String path) {
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
return blobstoreService.createUploadUrl(null == path ? "/upload" : path);
}
这是我服务器上的代码段。
工作流程不同。 给出您的示例:
在新帖子的表单下有“发布”按钮和“附加图片”按钮。
当用户单击“附加”按钮时,您要求用户选择一个文件并将其保存到BlobStore(或Google Cloud Storage)。 无需调用BlobstoreUtils.generateServingUrl(null)
-您需要获取上载URL。 调用返回键时,会将其存储在Post对象中。
当用户单击“发布”按钮时,会将发布-包括图像键(键)保存在数据存储区中。 因此,整个工作流程仅需要两个呼叫。
如果用户点击“取消”按钮-请记住删除上传的图像(如果有的话),否则它们将被孤立。 棘手的部分是,如果用户只是离开您的应用或失去连接,则删除这些图像。
如果需要,您可以撤消此过程-先保存帖子,然后让用户附加图片。 这不是大多数用户期望的,但是它解决了孤立图像的问题。
实际上,您可以在单个请求中发送所有内容。
请记住,当您使用通过调用blobstoreService.createUploadUrl(“ / yourservingurl”)获得的URL发送Blob时,GAE实际上会向另一个URL发出第一个请求,存储该Blob,然后调用/ yourservingurl将您传递给您的Blobkey传递给您可以通过执行以下操作来检索:
Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(req);
List<BlobKey> blobKeys = blobs.get("myFile");
因此,实际上,所有其他表单值都将在第一个请求之后丢失, 但是如果您可以动态构建该URL,例如
blobstoreService.createUploadUrl("/yourservingurl?param1=a¶m2=b")
那么您可以在Servlet上取回这些参数并立即保留所有内容(包括已存储的blob的blobkey),从而减少对数据存储的调用。
更新:步骤将是
1)在客户端收集所有参数,并使用这些参数创建一个上传URL,例如: blobstoreService.createUploadUrl("/yourservingurl?userId=989787")
。 GAE将为该特定请求生成一个唯一的URL。
提交表单时,GAE将保留该Blob并调用/ yourservingurl
2)在Servlet服务/ yourservingurl上,您将获得通过使用以下命令上传的所有blobkeys表单文件: blobstoreService.getUploads(request)
,并且可以获得标准request.getParameter("userId")
随附的参数
3)现在,在servlet中,您拥有发送的所有参数(例如,userId)以及blobkey,您可以在一个调用中保留Post对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.