0

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

目标:

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

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

我尝试过的事情:

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

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

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

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

4

3 回答 3

3

几点注意事项:

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

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

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

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

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

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

于 2012-05-16T18:14:00.523 回答
0

这是一种经过生产测试的方式:

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

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

  1. 从 GAE 获取上传 URL
  2. 将您的位图上传到 GAE,然后取回 blobkey
  3. 稍后,使用 blobkey 将图像提供给您的客户。

GAE Servlet 代码:

获取上传网址:

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());

安卓客户端代码

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())
于 2012-05-16T18:16:17.823 回答
0

这可能有用

如何使用谷歌应用引擎(java)上传和存储图像

或者,您可以尝试 blobstore api

http://code.google.com/appengine/docs/java/blobstore/overview.html

于 2012-05-16T17:42:48.107 回答