我在这个问题上挣扎了好几天,你是我解决问题的最后机会。
目标:
将位图从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来强制它,但它产生了新的问题。
所以我在问我可以从哪个方向来解决这个问题 谢谢。
答案 0 :(得分:3)
很少注意到:
不要使用Java序列化在JVM之间传输数据。 Java序列化不是标准化的,并且不保证JVM之间(甚至版本之间)兼容。
要发送二进制数据,最好使用HTTP POST并适当设置Content-Type
(例如application/octet-stream
)。
所以,要做这项工作,请执行以下操作:
创建一个处理POST并获取二进制数据的servlet。使用servletRequest.getInputStream()
获取二进制数据。
使用Blobstore FileService API将数据保存到blobstore。
在Android端使用http client发出POST请求,并将位图的二进制数据添加到其中。如果您需要添加一些元数据,请使用Http标题。
答案 1 :(得分:0)
这可能很有用
How to upload and store an image with google app engine (java)
或者,您可以尝试使用blobstore api
http://code.google.com/appengine/docs/java/blobstore/overview.html
答案 2 :(得分:0)
以下是经过生产测试的方式:
使用GAE appengine上传您的位图,并为未来的客户服务。
在Android代码上,请按以下步骤操作:
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())