如何使用Appengine Blobstore(使用Android)?

时间:2014-03-14 15:11:37

标签: google-app-engine blobstore

我想使用appengine Blobstore从我的android应用程序上载并获取图片。我有一些问题。我认为我不太了解blobstore的过程。

这就是我所做的:

在我的客户端(Android)我只是调用一个URL(api / pictures / upload /)并将我的图片作为一个字节数组(byte [])发布。我认为我的客户方面很好。

在我的服务器端(在泽西岛的java中使用appengine)这是我的网络服务:

- 上传网络服务:(此功能由android直接调用)

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadImageBis(@Context HttpServletRequest req, @Context HttpServletResponse res) throws IOException{

    BlobstoreService bs = BlobstoreServiceFactory.getBlobstoreService();
    bs.createUploadUrl("/upload");
    Map<String, List<BlobKey>> blobFields = bs.getUploads(req);
    List<BlobKey> blobKeys = blobFields.entrySet().iterator().next().getValue();
    if (blobKeys != null && !blobKeys.isEmpty()) {
        BlobKey blobKey = blobKeys.get(0);
        System.out.println("MY KEY: "+blobKey.getKeyString());
    }

    return null;
}

该行&#34; BlobstoreService bs = BlobstoreServiceFactory.getBlobstoreService(); &#34;创建错误:必须从blob上传回调请求中调用
但过了一段时间它会持续存在(在数据存储区或blobstore中),当我检查我的数据存储区时,会创建一个名为的新选项卡: BlobUploadSession

然后,当我尝试使用谷歌控制台上的密钥获取图片时,我有这样的错误:无法找到blob:BlobKey:... 我想这可能是图片存储在dataStore而不是blobstore?

但我认为我在上传网络服务中做错了。如果有人可以帮助我并解释错误,那将会很棒。 THX。

1 个答案:

答案 0 :(得分:0)

GAE上的Blobupload是一个两步过程:

一个。客户请求一次性上传网址:

@GET
@Produces("text/plain")
public String uploadImageBis(@Context HttpServletRequest req, @Context HttpServletResponse res) throws IOException{
  BlobstoreService bs = BlobstoreServiceFactory.getBlobstoreService();
  return bs.createUploadUrl("/upload");
}

湾客户端将多部分数据POST到该Url:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadImageBis(@Context HttpServletRequest req, @Context HttpServletResponse res) throws IOException{

  Map<String, List<BlobKey>> blobFields = bs.getUploads(req);
  List<BlobKey> blobKeys = blobFields.entrySet().iterator().next().getValue();
  if (blobKeys != null && !blobKeys.isEmpty()) {
    BlobKey blobKey = blobKeys.get(0);
    System.out.println("MY KEY: "+blobKey.getKeyString());
  }

  return null;
}