我正在开发一个与签名板连接的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程序员来说是微不足道的,但不是我!
我没有使用建议的库,因为它提供的方式比我需要的更多。
答案 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。