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

标签 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 的方式(我认为字节缓冲区是最好的,但我可能是错的),您建议如何完成?

最佳答案

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

从客户端开始,您可以为此使用 URLConnection,如 mini tutorial 中所述。 , 但它会非常冗长。您也可以使用 Apache HttpComponents Client为了这。但是这增加了额外的依赖性,我不确定你是否愿意在 Android 上使用它。

然后,在服务器端,你可以使用Apache Commons FileUploadmultipart/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/

相关文章:

Android Notification - 弹出对话框

java - RESTlet 启动初始化已弃用?

java - 有没有办法保持与静态 Web 服务的连接?

java - 如何使用java代码和pdfbox从pdf文件中提取参数

java - Java 掷骰子分配 : Calling a Method

android - 在没有 lambda 表达式的情况下检查 Android 上的互联网访问(Levit)

android - 如何处理 'Cannot Find Getter For Field'错误?

java - Servlet 将响应转发给调用者/上一页

java - 在 Java 中用 Servlet 替换 Sriplet

tomcat - coldfusion10 通过对预先存在的 tomcat 7 的 war