Java 如何将位图从Android流式传输到Google应用程序引擎Servlet?

Java 如何将位图从Android流式传输到Google应用程序引擎Servlet?,java,android,google-app-engine,Java,Android,Google App Engine,我为这个问题挣扎了几天,你是我解决它的最后机会 目标: BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); String url = blobstoreService.createUploadUrl(path_to_your_upload_servlet); 从android客户端上传位图到google应用程序引擎,并将其保存在数据存储中 我使用序列化将对象从客户端传输到服务器,

我为这个问题挣扎了几天,你是我解决它的最后机会

目标:

BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
String url = blobstoreService.createUploadUrl(path_to_your_upload_servlet);
从android客户端上传位图到google应用程序引擎,并将其保存在数据存储中

  • 我使用序列化将对象从客户端传输到服务器,反之亦然
我尝试过的事情:

BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
String url = blobstoreService.createUploadUrl(path_to_your_upload_servlet);
  • 发送位图
    • 但是我得到了
      java.io.notserializableeexception:android.graphics.Bitmap
  • 然后我尝试在客户端从位图Blob创建,如下所示:

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
    Byte[] bArray = bos.toByteArray();
    Blob blob = new Blob(bArray); 
    
    但是在客户端,我没有google应用程序引擎类(用于Blob),所以我试图通过提取特定的类来强制它,但它产生了新的问题

因此,我在问我可以从哪个方向解决这个问题。
谢谢

这可能有用

或者,您可以尝试BlobstoreAPI

这可能很有用

或者,您可以尝试BlobstoreAPI

几点注意:

  • 不要使用Java序列化在JVM之间传输数据。Java序列化没有标准化,不能保证JVM之间(甚至版本之间)兼容

  • 要发送二进制数据,最好使用HTTP POST并适当设置
    内容类型
    (例如
    应用程序/octet流

  • 因此,要使这项工作做到这一点:

  • 创建一个servlet来处理POST并获取二进制数据。用于获取二进制数据

  • 使用Blobstore将数据保存到Blobstore

  • 在Android端,使用a发出POST请求并将位图的二进制数据添加到其中。如果需要添加一些元数据,请使用Http头

  • 几点注意:

  • 不要使用Java序列化在JVM之间传输数据。Java序列化没有标准化,不能保证JVM之间(甚至版本之间)兼容

  • 要发送二进制数据,最好使用HTTP POST并适当设置
    内容类型
    (例如
    应用程序/octet流

  • 因此,要使这项工作做到这一点:

  • 创建一个servlet来处理POST并获取二进制数据。用于获取二进制数据

  • 使用Blobstore将数据保存到Blobstore

  • 在Android端,使用a发出POST请求并将位图的二进制数据添加到其中。如果需要添加一些元数据,请使用Http头


  • 以下是一种经过生产测试的方法:

    使用GAE appengine将位图上载到,并为未来的客户端提供服务

    在Android代码上,请执行以下步骤:

  • 从GAE获取上传URL
  • 将位图上传到GAE,并获取一个blobkey
  • 稍后,使用blobkey将图像提供给您的客户
  • GAE Servlet代码:

    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    String url = blobstoreService.createUploadUrl(path_to_your_upload_servlet);
    
    getUploadURL:

    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    String url = blobstoreService.createUploadUrl(path_to_your_upload_servlet);
    
    uploadServlet-存储在blobstore中,将blobkey返回给上传程序

    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    Map<String, List<BlobKey>> uploads = blobstoreService.getUploads(request);
    String fileName = uploads.keySet().iterator().next();
    final BlobKey blobKey = uploads.get(fileName).get(0);
    response.getWriter().println(blobKey.getKeyString());
    

    以下是一种经过生产测试的方法:

    使用GAE appengine将位图上载到,并为未来的客户端提供服务

    在Android代码上,请执行以下步骤:

  • 从GAE获取上传URL
  • 将位图上传到GAE,并获取一个blobkey
  • 稍后,使用blobkey将图像提供给您的客户
  • GAE Servlet代码:

    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    String url = blobstoreService.createUploadUrl(path_to_your_upload_servlet);
    
    getUploadURL:

    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    String url = blobstoreService.createUploadUrl(path_to_your_upload_servlet);
    
    uploadServlet-存储在blobstore中,将blobkey返回给上传程序

    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    Map<String, List<BlobKey>> uploads = blobstoreService.getUploads(request);
    String fileName = uploads.keySet().iterator().next();
    final BlobKey blobKey = uploads.get(fileName).get(0);
    response.getWriter().println(blobKey.getKeyString());
    

    要序列化位图,请参阅以下问题:Toda Moishe,但我在java.io.ObjectInputStream$BlockDataInputStream.readFully(ObjectInputStream.java:2699)处获得java.io.EOFEException,而不是尝试在Android上创建blob,而是将字节数组作为请求主体发送(有关更多详细信息,请参阅Peter的回答),看到这个问题:Toda Moishe,但我在java.io.ObjectInputStream$BlockDataInputStream.readFully(ObjectInputStream.java:2699)处得到java.io.EOFEException,而不是试图在Android上创建blob,而是发送字节数组作为请求的主体(更多详细信息,请参见Peter的回答)。这里合适的mimetype是
    image/png
    ,不是
    application/octet-stream
    。这里合适的mimetype应该是
    image/png
    ,而不是
    application/octet-stream
    。为什么你认为他在文件中有图像?这显然是内存中的位图。在android内存中保存位图可能非常棘手。位图内存是从外部分配的,并且是scarse。如果位图是动态创建的,我会首先将其写入存储器,然后尝试更漫长的上传过程。在现实生活中的应用程序中,随着时间的推移,将位图保存在内存中很可能会阻止应用程序显示和处理其他位图。我不认为拥有
    android.graphics.bitmap
    必然意味着它存储在视频内存中。不管怎样,OP的问题是试图上传位图;如果将图像写入文件是您认为他们应该采取的步骤,那么您应该将其记录下来。为什么您认为他在文件中有图像?这显然是内存中的位图。在android内存中保存位图可能非常棘手。位图内存是从外部分配的,并且是scarse。如果位图是动态创建的,我会首先将其写入存储器,然后尝试更漫长的上传过程。在现实生活中的应用程序中,随着时间的推移,将位图保存在内存中很可能会阻止应用程序显示和处理其他位图。我不认为拥有
    android.graphics.bitmap
    必然意味着它存储在视频内存中。不管怎样,OP的问题是试图上传位图;如果将其写入文件是您认为他们应该采取的步骤,那么您应该将其记录下来。