繁体   English   中英

我可以一次将图像保存到Blobstore并将数据保存到Datastore吗?

[英]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。 最棘手的问题是,要发送帖子(即将帖子保存到服务器),应用必须按该顺序-

  1. 将所有非blob数据发送到服务器。
  2. 等待服务器响应BlobstoreUtils.generateServingUrl(null)数据
  3. 将图像发送到BlobStore
  4. 让BlobStore使用图像的BlobKey或url将响应发送到我的服务器
  5. 将BlobKey / url存储在我的DataStore实体中

握手很多!!!

有没有一种方法可以在第一步中将所有数据发送到服务器:字符串和图像。 然后服务器从那里进行其他所有操作? 当然,我希望减少工作量。 我认为App Engine到现在必须已经相当成熟,而且必须有比我的架构更简单的方法。

现在,我当然在这里,因为我遇到了保存数据但BlobKey或URL未保存到实体的情况。 大约有10%的时间发生。 或许更少,但确实有10%的感觉。 这让我的用户疯狂,这意味着让我更加疯狂,因为我不想失去我的用户。

理想的情况下

  1. 应用程序通过一次调用将所有内容发送到服务器:图像和元数据,例如userId和synopsys
  2. 服务器以某种方式从Blobstore获取Blob密钥
  3. 服务器将图像发送到blobstore,以将其存储在提供的blob键上,并且服务器将其他数据发送到DataStore,其中也包括数据存储区中的blob键。

更新

    public static String generateServingUrl(String path) {
        BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
        return blobstoreService.createUploadUrl(null == path ? "/upload" : path);
    }

这是我服务器上的代码段。

工作流程不同。 给出您的示例:

  1. 在新帖子的表单下有“发布”按钮和“附加图片”按钮。

  2. 当用户单击“附加”按钮时,您要求用户选择一个文件并将其保存到BlobStore(或Google Cloud Storage)。 无需调用BlobstoreUtils.generateServingUrl(null) -您需要获取上载URL。 调用返回键时,会将其存储在Post对象中。

  3. 当用户单击“发布”按钮时,会将发布-包括图像键(键)保存在数据存储区中。 因此,整个工作流程仅需要两个呼叫。

  4. 如果用户点击“取消”按钮-请记住删除上传的图像(如果有的话),否则它们将被孤立。 棘手的部分是,如果用户只是离开您的应用或失去连接,则删除这些图像。

如果需要,您可以撤消此过程-先保存帖子,然后让用户附加图片。 这不是大多数用户期望的,但是它解决了孤立图像的问题。

实际上,您可以在单个请求中发送所有内容。

请记住,当您使用通过调用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&param2=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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM