下面是我的代码:
try
{
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image, "png", os);
byte[] bytes = os.toByteArray();
os.flush();
os.close();
String code = encode(bytes);
URL base = applet.getCodeBase();
URL url = new URL(base.getProtocol(),
base.getHost(),
base.getPort(),
"/image.php?code=" + code);
HttpURLConnection c = (HttpURLConnection) url.openConnection();
c.setRequestMethod("POST");
c.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
c.setDoOutput(true);
DataOutputStream s = new DataOutputStream(c.getOutputStream());
s.writeBytes("code=" + code);
applet.getAppletContext().showDocument(url, "_blank");
}
catch (Exception e)
{
e.printStackTrace();
JOptionPane.showMessageDialog(
this,
e.toString(),
"Error",
JOptionPane.ERROR_MESSAGE);
}
当我使用showDocument时,POST请求已经完成,所以我真正要做的是显示一个空白页面(相反,我想显示图像)。image.php的源代码如下:
<?php
$code = base64_decode($_GET["code"]);
header('Content-Type: image/png');
echo $code;
?>
您在Java上使用POST,在PHP上使用GET…
您的showDocument
和applet的POST
请求是完全独立的。POST请求是由applet完成的,结果只能在applet内部使用(但您根本没有读取它-我甚至不确定它是否被发送)。
showDocument
,相反,总是做一个GET
请求-没有办法指示浏览器在这里使用POST。但是,您可以使用applet中的JavaScript桥接为新的HTML页面创建POST请求。
理论上,它应该工作,因为你发送图像数据作为URL的一部分,太,但可能有长度限制的URL数据在Web服务器,或在从Java-Plugin到浏览器的链接。
你可以在data:
URL中编码你的图像,并将其用于showDocument
。
URL url = new URL("data:image/png;base64," + code);
(我没有测试Java的URL类是否实际接受这个。请试着报告。我想它受到相同的浏览器URL长度限制。)
另一种方法是让服务器存储图像(至少一段短时间)。然后,您将使用applet中的POST来上传数据,获取(短)一些唯一标识符,然后将其传递给showDocument
URL。