可以将图像作为ByteBuffer发送到我的Servlet吗?

时间:2010-09-20 19:47:05

标签: java android servlets outputstream android-image

我试图让我的android手机连接到我的servlet并发送一个特定的图像。我想这样做的方法是使用copyPixelsToBuffer()函数,然后尝试通过一些输出流将其发送到servlet(类似于我在普通的独立java应用程序中的操作方式)。这种方式有用吗?如果是这样,我会使用什么样的流?我应该只使用DataOutputStream并执行以下操作:

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的方式(我认为字节缓冲区最好,但我可能错了),你会怎么建议这样做?

1 个答案:

答案 0 :(得分:2)

由于HttpServlet通常会侦听HTTP请求,因此您希望使用multipart/form-data编码通过HTTP发送二进制数据,而不是像这样生成(未格式化)。

从客户端开始,您可以使用此mini tutorial中所述的URLConnection,但这将非常详细。您也可以使用Apache HttpComponents Client。这增加了额外的依赖性,我不确定你是否想在Android上拥有它。

然后,在服务器端,您可以使用Apache Commons FileUploadmultipart/form-data编码的请求正文中解析项目。你可以在this answer中找到一个代码示例,看看servlet的doPost()应该是什么样的。

至于你的代码示例:不需要包装在DataOutputStream中。你没有从DataOutputStream的设施中受益。您只是使用了由write(byte[])返回的基本OutputStream已提供的URLConnection#getOutputStream()方法。此外,Bitmap具有compress()方法,您可以使用该方法将更加标准且易于理解的格式(PNG,JPG等)压缩为任意OutputStream。 E.g。

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

执行此操作,而不是代码中的output.write(bytes)