我正在尝试让我的 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 的方式(我认为字节缓冲区是最好的,但我可能是错的),您建议如何完成?
最佳答案
由于 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)
。
关于java - 可以将图像作为 ByteBuffer 发送到我的 Servlet 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3754941/