ByteArrayOutputStream上传到服务器

时间:2009-12-21 14:29:36

标签: java http jpeg

我正在开发一个与签名板连接的applet。签名板API具有返回BufferedImage的函数(假设其名为API_CALL_TO_RETURN_BUFFERED_IMAGE())。我可以编码为jpeg并将此图像写入文件就好了(使用FileOutputStream)。但是,我需要将jpeg编码的图像上传到服务器,而不是写入本地磁盘。我可以很好地将数据发送到服务器,我可以很好地编码图像;但我正在努力让两个任务在中间相遇。

以下是代码的精简版本(try-catch,function,classes省略):

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?

EDIT / UPDATE:

我的解决方案是做一个mutlipart POST。将Content-Type标头设置为multipart / form-data的原因如此链接http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4所示:

  

multipart / form-data应该用于文件,非ascii值或二进制数据

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

dos.writeBytes(baos.toByteArray());

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

我没有使用建议的库,因为它提供的方式比我需要的更多。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

当你将一个流写入另一个流时,可能会产生很多开销;缓冲区,try / catch块,.close(),更多try / catch块。

Apache Commons IO Library为您自动完成大部分内容。

如果你不赶时间,弄清楚如何去做,但从长远来看,只需使用Commons IO。有关缓冲副本如何工作的示例,Commons IO页面中的第一个示例显示了上半部分;而不是System.out.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();
 }

如果您的文件不是字符串数据,则需要读取byte []而不是String。