如何让applet将图像传输到Web服务器

时间:2011-10-28 15:02:10

标签: java applet

我正在开发一个与签名板接口的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服务器。

2 个答案:

答案 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位。

感谢您的帮助。它让我更好地了解了我需要谷歌。评论非常感谢。