【问题标题】:Possible to send an image to my Servlet as a ByteBuffer?可以将图像作为 ByteBuffer 发送到我的 Servlet?
【发布时间】:2011-04-14 20:56:47
【问题描述】:

我正在尝试让我的 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 的方式(我认为字节缓冲区最好,但我可能错了),您会如何建议这样做?

【问题讨论】:

    标签: java android servlets outputstream android-image


    【解决方案1】:

    由于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[]) 方法,该方法已由基本OutputStream 提供,由URLConnection#getOutputStream() 返回。此外,Bitmap 有一个compress() 方法,您可以使用该方法使用更标准和更易于理解的格式(PNG、JPG 等)将其压缩为任意OutputStream。例如

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

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

    【讨论】:

    • 感谢您的信息,我会研究这些资源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2020-07-11
    相关资源
    最近更新 更多