2010-09-20 25 views
1

我试图让我的android手机连接到我的servlet并发送给它一个特定的图像。我认为我会这样做的方式是使用copyPixelsToBuffer()函数,然后尝试通过一些输出流将其发送到servlet(类似于我在常规独立Java应用程序中的做法)。这种方式会工作吗?如果是这样,我准确使用什么样的流?我应该用DataOutputStream类,只是做一些这样的:可能将图像作为字节缓冲区发送到我的Servlet?

ByteBuffer imgbuff; 
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 
bm.copyPixelsToBuffer(bm); 

...code... 
URLConnection sc = server.openConnection(); 
sc.setDoOutput(true); 

DataOutputStream out = new DataOutputStream(sc.getOutputStream()); 
out.write(imgbuff.array()); 
out.flush(); 
out.close(); 

注:据我所知,这可能不是使用Android操作系统连接到服务器的正确方法,但目前我的工作只是如何发送图像,而不是连接(除非这与图像的发送方式有关)。

如果这不是你建议将图像发送到servlet的方式(我认为字节缓冲区最好,但我可能是错的),你会如何推荐这样做?

回答

2

由于HttpServlet通常监听HTTP请求,所以您希望使用multipart/form-data编码通过HTTP发送二进制数据,而不是原始(未格式化)。

从客户端开始,您可以使用URLConnection作为此mini tutorial中概述的内容,但它会非常冗长。您也可以使用Apache HttpComponents Client。这增加了额外的依赖关系,我不确定你是否希望在Android上拥有它。

然后,在服务器端,您可以使用Apache Commons FileUpload解析multipart/form-data编码请求主体中的项目。您可以在this answer中找到代码示例,该servlet的doPost()应该如何。

至于你的代码示例:包装在DataOutputStream是不必要的。您没有使用DataOutputStream的设施。您正在使用write(byte[])方法,该方法已由URLConnection#getOutputStream()返回的基本OutputStream提供。此外,Bitmap有一个compress()方法,您可以使用该方法使用更加标准和可理解的格式(PNG,JPG等)将其压缩为任意OutputStream。例如。

output = connection.getOutputStream(); 
// ... 
bitmap.compress(CompressFormat.JPEG, 100, output); 

这样做而不是output.write(bytes)与您的代码一样。

+0

感谢您的信息,我会研究这些资源。 – Fizz 2010-09-20 22:19:58

+0

不客气。 – BalusC 2010-09-20 22:22:22