我正在开发一个与签名板接口的applet,可以使用以下代码将图像写入文件:
sigObj.setImageXSize(30);
sigObj.setImageYSize(10);
sigObj.setImageJustifyMode(5);
sigObj.setImagePenWidth(5);
BufferedImage sigImage = sigObj.sigImage();
try
{
int w = sigImage.getWidth(null);
int h = sigImage.getHeight(null);
int[] pixels = new int[(w * h) * 2];
sigImage.setRGB(0, 0, 0, 0, pixels, 0, 0);
FileOutputStream fos = new
FileOutputStream("c:\\_img\\sig.jpg");
JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(fos);
jpeg.encode(sigImage);
fos.close();
}
catch (java.io.IOException exception) { System.out.println("Error IO Exception."); }
目标是将文件传输到Web服务器,最终将.jpg或.bmp映像放入Oracle blob。最好的方法是什么?
在这里猜测:
方法1:
让applet将.jpg文件写为十六进制编码字符串,将字符串移动到隐藏的表单字段,然后提交oracle可以读取隐藏字段的页面,并将其转换为带有blobVar := HEXTORAW( url('sigJpg'));
的pl / sql中的blob
方法2:
让applet执行POST并提交文件
我的java技能很绿,所以如果推荐使用其中任何一种方法,我都不能100%肯定。一旦文件移动到Web服务器,我很确定我可以找到一种方法使用Oracle pl / sql将其填充到数据库中。我不知道如何将文件发送到Web服务器。
答案 0 :(得分:0)
您的方法2是您应该实施的方法。实际上这不是一个如此巨大的问题。以下是一个很好的例子:http://www.exampledepot.com/egs/java.net/Post.html
您应该将您的图像编写为流式传输,您可以完全按照将其写入文件时的方式从URL连接中获取。
但这还不够。你必须实现服务器端。通常,您应该实现servlet并覆盖其doPost()
方法,您将获得帖子的内容。然后执行您需要的操作:打开JDBC连接并将文件写入DB。虽然我不推荐这种方法:你与DB中的BLOB无关。我认为更好的方法是将图像写入文件系统并仅在DB中存储它的路径。
我希望我能给你足够的提示。您可以通过2分钟googleing找到更多详细信息。祝好运。
答案 1 :(得分:0)
搞定了。我发现了2004年的一篇文章,其中有人在做同样的事情。唯一的区别是我在发布之前将文件转换为十六进制字符串。我这样做的唯一原因是因为我知道如何将十六进制字符串转换为Oracle中的blob。
private String byteToString(byte[] data) {
String text = new String();
for ( int i = 0; i < data.length; i++ )
text += (char) ( data[i] & 0x00FF );
return text;
}
private static String bytesToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 2);
Formatter formatter = new Formatter(sb);
for (byte b : bytes) {
formatter.format("%02x", b);
}
return sb.toString();
}
public void writeImageToServer(URL scriptURL, BufferedImage img){
try {
ByteArrayOutputStream jpegOutput = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(jpegOutput);
encoder.encode(img); // imagedata are coded here
HttpURLConnection urlConnection = (HttpURLConnection)
scriptURL.openConnection();
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.setUseCaches(false);
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
byte[] imageData = jpegOutput.toByteArray();
//String imageString = byteToString(imageData); // if you want a string
String imageString = bytesToHexString(imageData); // if you want hex string
String content = "img=" + URLEncoder.encode (imageString,"UTF-8");
urlConnection.setRequestProperty("Content-length", String.valueOf(content.length()));
OutputStream urlout = urlConnection.getOutputStream();
DataOutputStream printOut = new DataOutputStream(urlout);
printOut.writeBytes(content); // writing data to the serverscript
urlout.flush();
urlout.close();
printOut.flush();
printOut.close();
jpegOutput.flush();
jpegOutput.close();
urlConnection.disconnect();
//System.err.println("Serverresponse: "+ urlConnection.getResponseMessage());
// this works in firefox
//try { getAppletContext().showDocument (new URL("javascript:msg(\""+ urlConnection.getResponseMessage() + "\")")); } catch (MalformedURLException me) { }
}
catch( IOException e ){ e.printStackTrace(); }
}
在oracle中通过mod_plsql:
procedure image_post_handeler ( img varchar2) is
b blob;
begin
b := HEXTORAW( UTL_URL.UNESCAPE(url('img')) );
insert into image_table (id, b) values (id_seq.nextval, b );
end;
要准备好生产,它必须能够建立https连接并可能建立cookie。如果我传递一个url参数,我可以解决cookie问题。
我可能决定将十六进制字符串交回浏览器,将其放在表单中的隐藏字段中,然后提交表单。
可能有更好的方法来做到这一点。这是一次学习如何创建一个applet,jar类,签名,把.dll文件放在一起的机会。只是搞清楚applet运行的java home是一个挑战,大约6,一些32位和一些64位。
感谢您的帮助。它让我更好地了解了我需要谷歌。评论非常感谢。