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创建,如下所示:
但是在客户端,我没有google应用程序引擎类(用于Blob),所以我试图通过提取特定的类来强制它,但它产生了新的问题ByteArrayOutputStream bos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos); Byte[] bArray = bos.toByteArray(); Blob blob = new Blob(bArray);
谢谢 这可能有用 或者,您可以尝试BlobstoreAPI 这可能很有用 或者,您可以尝试BlobstoreAPI 几点注意:
内容类型
(例如应用程序/octet流
)内容类型
(例如应用程序/octet流
)以下是一种经过生产测试的方法: 使用GAE appengine将位图上载到,并为未来的客户端提供服务 在Android代码上,请执行以下步骤:
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代码上,请执行以下步骤:
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的问题是试图上传位图;如果将其写入文件是您认为他们应该采取的步骤,那么您应该将其记录下来。