我试图让我的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的方式(我认为字节缓冲区最好,但我可能错了),你会怎么建议这样做?
答案 0 :(得分:2)
由于HttpServlet
通常会侦听HTTP请求,因此您希望使用multipart/form-data
编码通过HTTP发送二进制数据,而不是像这样生成(未格式化)。
从客户端开始,您可以使用此mini tutorial中所述的URLConnection
,但这将非常详细。您也可以使用Apache HttpComponents Client。这增加了额外的依赖性,我不确定你是否想在Android上拥有它。
然后,在服务器端,您可以使用Apache Commons FileUpload从multipart/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)
。