有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ByteArrayOutputStream已上载到服务器

我正在开发一个与签名板接口的小程序。签名板API有一个返回BuffereImage的函数(假设其调用的API调用了\u TO \u RETURN\u BUFFERED\u IMAGE())。我可以编码成jpeg格式,并将此图像写入文件(使用FileOutputStream)。但是,我需要将jpeg编码的图像上传到服务器,而不是写入本地磁盘。我可以将数据发布到服务器上,并且可以对图像进行编码;但是我很难让这两个任务在中间相遇。

以下是代码的浓缩版本(省略try-catch、函数和类):

ByteArrayOutputStream baos = new ByteArrayOutputStream();
JPEGImageEncode jie = JPEGCodec.createJPEGEncoder(baos);
jpeg.encode(API_CALL_TO_RETURN_BUFFERED_IMAGE());         // assume magic

// baos now contains jpeg data

URLConnection urlc = new URL(some_url).openConnection();
// set up urlc request headers and such
DataOutputStream dos = new DataOutputStream(urlc.getOutputStream());
dos.writeBytes(???);   // ??? should be image=[the data in baos above]

// close stuff

原来我想,

String post_data = URLEncoder.encode("image=" + new String(baos.toByteArray()), some_charset);
dos.writeBytes(post_data);

但这显然扭曲了形象

This is what the proper (written locally) image looks like

我只能发布一个超链接,但扭曲的图像在这里:imgur。com/mbmJL。jpg

如何将ByteArrayOutputStream写入DataOutputStream

编辑/更新:

我的解决方案是做一个mutlipart POST。将内容类型头设置为多部分/表单数据的原因是,因为此链接http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4表示:

multipart/form-data should be used for files, non-ascii values, or binary data

至于将ByteArrayOutputStream写入DataOutputStream,它看起来像:

dos.writeBytes(baos.toByteArray());

我相信这对全职Java程序员来说是微不足道的,但我不是

我没有使用建议的图书馆,因为它提供了比我需要的更多的途径


共 (2) 个答案

  1. # 1 楼答案

    我将通过使用HttpClient来管理发布,从而简化上面的一些内容。这是Post教程和Multipart Post教程(如果需要)。不清楚您需要哪一个,但是使用HttpClient将解决创建HTTP请求的结构和内容时的许多问题

  2. # 2 楼答案

    当您将一个流写入另一个流时,可能会产生大量开销;缓冲区,尝试/捕获块。close(),更多try/catch块

    Apache Commons IO Library为您自动完成大部分操作

    如果你不着急,想一想怎么做,但从长远来看,只需使用Commons IO即可。对于缓冲副本如何工作的示例,Commons IO页面的第一个示例显示了前半部分;而不是系统。出来println,你想把这行写入另一个流

     InputStream in = new URL( "http://jakarta.apache.org" ).openStream();
     try {
       InputStreamReader inR = new InputStreamReader( in );
       BufferedReader buf = new BufferedReader( inR );
       String line;
       while ( ( line = buf.readLine() ) != null ) {
         System.out.println( line );
       }
     } finally {
       in.close();
     }
    

    如果文件不是字符串数据,则您希望读取字节[],而不是字符串