我可以将图像保存到Blobstore并将数据保存到数据存储中吗?

这个论点已经被多次提出并解决了:Blobstore比DataStore更适合存储图像。 现在说我有一个类似于Instagram或Facebook或Yelp的应用程序或任何图像密集型应用程序。 在我的特殊情况下,理想模型将是

public class IdealPostModel{

  Integer userId;
  String synopsys;
  Blob image;
  ...//more data/fields about the post

}

但由于我必须使用BlobStore,因此我的模型没有blob,而是使用URL或BlobKey。 重要的是要发送帖子(即将帖子保存到服务器),应用程序必须 - 按该顺序 -

  • 将所有非blob数据发送到服务器。
  • 等待服务器响应BlobstoreUtils.generateServingUrl(null)数据
  • 将图像发送到BlobStore
  • 让BlobStore使用BlobKey或图像的URL向我的服务器发送响应
  • 将BlobKey / url存储在我的DataStore实体中
  • 这是很多握手!!!

    有没有办法在第一步发送所有的数据到服务器:字符串和图像。 然后从那里有服务器做其他事情? 当然,我在这里希望减少工作量。 我认为App Engine现在必须相当成熟,并且必须比我的架构更简单。

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

    理想的情况下

  • 应用程序在一次调用中将所有内容发送到服务器:图像和元数据,例如userId和synopsys
  • 服务器以某种方式从Blobstore获取blob密钥
  • 服务器将图像发送到blobstore,以存储在提供的blob密钥处,并且服务器将其他数据发送到DataStore,其中还包括数据存储区中的blob密钥。
  • 更新

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

    这是我的服务器上的一个片段。


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

    请记住,当您使用通过调用blobstoreService.createUploadUrl(“/ yourservingurl”)获得的URL发送blob时,GAE实际上首先请求到另一个URL,存储blob,然后调用/ yourservingurl传递给您的blobkeys可以通过做:

    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 serve / yourservingurl上,您将获得您上传的所有blobkeys表单文件: blobstoreService.getUploads(request) 并且您可以获取标准request.getParameter("userId")包含的参数

    3)现在在你的servlet中你有所有你发送的参数(例如userId)和blobkey,你可以在一次调用中保留你的Post对象。


    工作流程不同。 以你的榜样为例:

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

  • 当用户点击附加按钮时,您要求用户选择一个文件并将其保存到BlobStore(或Google云端存储)。 无需调用BlobstoreUtils.generateServingUrl(null) - 您需要获取上传URL。 当一个调用返回一个键时,你将它存储在Post对象中。

  • 当用户点击“发布”按钮时,可以将帖子 - 包括图像键(键)保存到数据存储区中。 因此,整个工作流程只需要两个电话。

  • 如果用户点击取消按钮 - 记得删除上传的图像(如果有的话),或者他们将成为孤儿。 棘手的部分是如果用户只是离开了你的应用程序或丢失了连接,就要删除这些图像。

  • 如果你愿意,你可以逆转这个过程 - 先保存文章,然后让用户附上图片。 这不是大多数用户所期望的,但它解决了孤立图像的问题。

    链接地址: http://www.djcxy.com/p/67465.html

    上一篇: Can I save images to Blobstore and save data to Datastore in one trip?

    下一篇: GAE datastore admin copy failing on MapReduce model to JSON conversion