Applet soll Bild auf Server speichern



  • hallo leute,

    ich hab ein problem, mein applet dazu zu bewegen ein bild auf dem webserver (apache auf WinXP) abzuspeichern. um mir umstände mit zugriffsrechten zu vermeiden schreibe ich das bild ins gleiche verzeichnis wie das, aus dem das applet geladen wurde (im moment das webroot: htdocs). hab schon verschieden wege versucht, mit unterschiedlichen ergebnissen:

    1. versuch:

    private void writeImageToServer(URL fileURL,BufferedImage img){
          try {      
            URLConnection urlConnection = fileURL.openConnection();
            urlConnection.setDoOutput(true);
            OutputStream urlout = urlConnection.getOutputStream();
    
            ImageIO.write(img,"jpg",out);
    
            urlout.close(); //habs auch schon ohne dies close() versucht
          }
          catch( IOException e ){
            e.printStackTrace();
          }
        }
    

    ergebnis:
    error.log von apache wurde um diese zeilen bereichert:

    [Tue Jun 08 14:44:39 2004] [error] [client 127.0.0.1] File does not exist: c:/programme/apache group/apache/htdocs/meta-inf/services/javax.imageio.spi.imagereaderspi
    [Tue Jun 08 14:44:39 2004] [error] [client 127.0.0.1] File does not exist: c:/programme/apache group/apache/htdocs/meta-inf/services/javax.imageio.spi.imagetranscoderspi
    [Tue Jun 08 14:44:39 2004] [error] [client 127.0.0.1] File does not exist: c:/programme/apache group/apache/htdocs/meta-inf/services/javax.imageio.spi.imageoutputstreamspi
    [Tue Jun 08 14:44:39 2004] [error] [client 127.0.0.1] File does not exist: c:/programme/apache group/apache/htdocs/meta-inf/services/javax.imageio.spi.imagewriterspi
    [Tue Jun 08 14:44:39 2004] [error] [client 127.0.0.1] File does not exist: c:/programme/apache group/apache/htdocs/meta-inf/services/javax.imageio.spi.imageinputstreamspi

    wie kann das sein? was hat der webserver mit java (in diesem fall speziel ImageIO) zu schaffen, das läuft doch alles client-seitig, er sollte von diesen zugriffen doch nie etwas mitbekommen. die dateien in meinem jar-file mitzuführen ist ja auch käse, schlieslich will er sie aus dem meta-inf verzeichnis haben ... hä??? 😕
    hängt euch aber nicht an dem 127.0.0.1 auf, ich entwickel grad auf der gleichen maschine, wo auch der webserver läuft -> der zugriff auf localhost ist also beabsichtigt.

    2. versuch:

    private void writeImageToServer(URL fileURL,BufferedImage img){
          try {      
            URLConnection urlConnection = fileURL.openConnection();
            urlConnection.setDoOutput(true);
    
            OutputStream urlout = urlConnection.getOutputStream();
    
            BufferedOutputStream out = new BufferedOutputStream(urlout);
    
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    
            encoder.encode(img);    
    
            out.close(); //auch ohne close() schon versucht
          }
          catch( IOException e ){
            e.printStackTrace();
          }
        }
    

    ergebnis:
    nichts ... weder die java-konsole noch der webserver melden eine fehlermeldung oder eine warnmeldung. das bild ist aber leider auch nicht da. hab die festplatte schon danach durchsuchen lassen.

    und schließlich versuch 3:

    private void writeImageToServer(URL fileURL,BufferedImage img){
          try {      
            File file = new File(fileURL.toString());
            file.createNewFile();        
    
            BufferedOutputStream out = new BufferedOutputStream(
                                                new FileOutputStream(file));
    
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    
            encoder.encode(img);    
    
            out.close();
          }
          catch( IOException e ){
            e.printStackTrace();
          }
        }
    

    ergebnis:
    AccessControlException: access denied (java.io.FilePermission http:\localhost\test.jpg write)
    klar, da schlägt der SecurityManager bei createNewFile() zu. ich müßte dafür mein applet erst signieren. dazu fällt mir nur die frage an euch ein, ob jemand weiß, wie ich diese signierung durchführe und volles zugriffsrecht garantiere, ohne java.policy beim client zu editieren bzw. ohne an irgend eine firma 400$ für deren zertifikat abdrücken zu müssen?

    muß ich bei meinem webserver irgendetwas einstellen um mein bild schreiben zu können. ich dachte ein applet hätte auf das verzeichnis aus dem es geladen wird lese- und schreibrecht. aber wenn mein problem mit den rechten zusammenhängen würde, sähen die fehlermeldungen anders aus. ich erkenne nicht, wo ich bei versuch 1. und 2. den fehler gemacht habe. übergeben bekommt meine routine immer 'new URL("http://localhost/test.jpg")' und ein selbsterzeugtes BufferedImage (letzteres ist auch definitiv da und gefüllt (bereits geprüft)).

    ausserdem noch die frage, wo ich eigentlich das outputStream.close() brauche und wo nicht?

    ich bin für alle vorschläge offen und sehr dankbar, solange das bild als jpg auf dem server gespeichert wird und ich kein java.policy-file auf clientseite editieren bzw. irgendwas für eine signierung zahlen muß.

    vielen dank
    bernd


Anmelden zum Antworten