如何将位图从Android流式传输到Google App Engine Servlet?

时间:2012-05-16 15:43:34

标签: java android google-app-engine

我在这个问题上挣扎了好几天,你是我解决问题的最后机会。

目标:

将位图从Android客户端上传到谷歌应用引擎并将其保存在数据存储区中。

  • 我正在使用序列化将对象从客户端传输到服务器,反之亦然。

我尝试过的事情:

  • 发送位图
    • 但我得到java.io.NotSerializableException: android.graphics.Bitmap
  • 然后我尝试在客户端创建Bitmap Blob,如下所示:

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
    Byte[] bArray = bos.toByteArray();
    Blob blob = new Blob(bArray); 
    

    但是在客户端我没有谷歌应用程序引擎类(对于Blob),所以我试图通过提取特定的classess来强制它,但它产生了新的问题。

所以我在问我可以从哪个方向来解决这个问题 谢谢。

3 个答案:

答案 0 :(得分:3)

很少注意到:

  1. 不要使用Java序列化在JVM之间传输数据。 Java序列化不是标准化的,并且不保证JVM之间(甚至版本之间)兼容。

  2. 要发送二进制数据,最好使用HTTP POST并适当设置Content-Type(例如application/octet-stream)。

  3. 所以,要做这项工作,请执行以下操作:

    1. 创建一个处理POST并获取二进制数据的servlet。使用servletRequest.getInputStream()获取二进制数据。

    2. 使用Blobstore FileService API将数据保存到blobstore。

    3. 在Android端使用http client发出POST请求,并将位图的二进制数据添加到其中。如果您需要添加一些元数据,请使用Http标题。

答案 1 :(得分:0)

答案 2 :(得分:0)

以下是经过生产测试的方式:

使用GAE appengine上传您的位图,并为未来的客户服务。

在Android代码上,请按以下步骤操作:

  1. 从GAE获取上传网址
  2. 将您的位图上传到GAE,并获得blobkey
  3. 稍后,使用blobkey将图像提供给您的客户。
  4. GAE 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());
    

    Android客户端代码

    String uploadUrl = getUrlAsString(..your getUrl servlet path...)
    // Upload to GAE (include apache-mime4j.jar and httpmime.jar in your project for this code)
    File file = new File(imageFilePath);
    HttpPost postRequest = new HttpPost(uploadUrl);
    MultipartEntity entity = new MultipartEntity();
    entity.addPart("file", new FileBody(file));
    postRequest.setEntity(entity);
    HttpResponse httpResponse;
    HttpClient httpClient = new DefaultHttpClient();
    httpClient.getParams().setBooleanParameter("http.protocol.handle-redirects",false);
    
    httpResponse = httpClient.execute(postRequest);
    int status = httpResponse.getStatusLine().getStatusCode();
    String blobKey = getInputStreamAsString(httpResponse.getEntity().getContent())