• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Von JApplet zu einer php Seite Bild(er) schicken

Status
Für weitere Antworten geschlossen.

Break

Neues Mitglied
Hi, ich möchte von einen Applet, wo ich Dateien(Bilder) auswähle, weiterschicken an eine Php Seite. Aber ich mache irgend ein Fehler, ich empfange nicht mal einen String den ich extra mitschick. Hier der Java code vielleicht kann mir einer helfen.
PHP:
private void btnabschickenActionPerformed(java.awt.event.ActionEvent evt) {
        URL url=null;
        try{
            url=new URL("http://localhost/testphp.php"); 
        }
        catch(MalformedURLException me){}
        try{       
                    try{
                        String hostname = "localhost";
                        int port = 80;
                        InetAddress addr = InetAddress.getByName(hostname);
                        Socket socket = new Socket(addr, port);

                        // Send header
                        String path = "/testphp.php";

                        File theFile = new File("C:\\Dokumente und Einstellungen\\Eigene Dateien\\buecherseiten.jpg");
                        System.out.println ("size: " + (int) theFile.length());
                        DataInputStream fis = new DataInputStream(new BufferedInputStream(new
                        FileInputStream(theFile)));
                        byte[] theData = new byte[(int) theFile.length( )];

                        fis.readFully(theData);
                        fis.close();


                        DataOutputStream raw = new
                        DataOutputStream(socket.getOutputStream());
                        Writer wr = new OutputStreamWriter(raw);

                        String command =
                    
                        "POST "+path+" HTTP/1.0\r\n"
                        + "Content-type: multipart/form-data, boundary=mango\r\n"
                        + "Content-length: " + ((int) theFile.length()) + "\r\n"
                        + "\r\n"
                        + "--mango\r\n"
                        + "content-disposition: name=\"MAX_FILE_SIZE\"\r\n"
                        + "\r\n"
                        + "\r\n--mango\r\n"
                        + "content-disposition: attachment; name=\"datafile\""
                        + "filename=\"test.jpg\"\r\n"
                        + "Content-Type: image/jpeg\r\n"
                        + "Content-Transfer-Encoding: binary\r\n"
                        + "\r\n";
                        

                        wr.write(command);

                        wr.flush();
                        raw.write(theData);
                        raw.flush( );
                        wr.write("\r\n--mango--\r\n");
                        wr.flush( );

                        BufferedReader rd = new BufferedReader(new
                        InputStreamReader(socket.getInputStream()));
                        String line;
                        while ((line = rd.readLine()) != null) {
                        System.out.println(line);
                        }
                        wr.close();
                        raw.close();
 
Werbung:
Hallo,

Wenn Du schon keine Debug-Logs Dir einbauen kannst und/oder willst, solltest Du zumindest in der Java-Console Deines Browsers nachschauen, ob das Applet nicht bereits beim Zugriff auf die lokal liegenden Datei ein Problem hat. Ansonsten pö a pö mit System.out.println() dir Debug Meldungen ausgeben lassen und den Fehler eingrenzen ...

Gruß,
Jumper,the II.
 
Er gibt keine Fehler aus, er kann die Seite auch aufrufen und die Antwortet auch aber die PHP Seite erhält nichts. Hier mal die Ausgabe von der elipse konsole:
Code:
C:\Dokumente und Einstellungen\Eigene Dateien\Applets\search-Dateien\EchoApplet.htm
size: 17877
HTTP/1.1 200 OK
Date: Tue, 05 Aug 2008 12:35:29 GMT
Server: Apache/2.2.9 (Win32) DAV/2 mod_ssl/2.2.9 OpenSSL/0.9.8h mod_autoindex_color PHP/5.2.6
X-Powered-By: PHP/5.2.6
Set-Cookie: PHPSESSID=3d90719b72a2687f5c30f7fc9671fe96; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 442
Connection: close
Content-Type: text/html

<!doctype html public "-//W3C//DTD HTML 4.0 //EN">
<html>
<head>
       <title>Title here!</title>
</head>
<body> 
<h1>HTML Ausgabe</h1>
PHP Ausgabe
ausgabe1:
ausgabe2:
ausgabe3:
ausgabe4:
</body>
</html>
die ausgaben 1-4 sollten eigentlich Strings die ich auch verschicken wollte ausgeben aber sie kommen nicht an. Zum Testen benutze ich diese php Datei:


PHP:
<!doctype html public "-//W3C//DTD HTML 4.0 //EN">
<html>
<head>
       <title>Title here!</title>
</head>
<body> 
<h1>HTML Ausgabe</h1>
<?php
    $var = "PHP Ausgabe\n";
    echo $var;
    $empfang = $_POST["Name"]; 
    
    echo"ausgabe1:". $empfang."\n";
    echo "ausgabe2:". $_POST["Name"]."\n";
    echo "ausgabe3:".$var1 = $HTTP_GET_VARS["Name"]."\n";
    echo "ausgabe4:".$var1 = $HTTP_POST_VARS["Name"]."\n";
    ?>
</body>
</html>
 
Werbung:
Hallo,

jetzt kann man auch den Fehler verstehen :-)

Du solltest mal die RFC 1867 und deren nachkommen lesen :-D Ich habe den entscheidenden Java-Teil mal raus genommen:
Code:
      String boundary = "mango";
      long bodysize = -1;
      
      String body_fields = "";
      String body_finish = "--" + boundary + "--\n";
      String body_file1_pre = "";
      String body_file1_post = "";
      
      
      body_fields += "" 
        + "--" + boundary + "\n" 
        + "Content-Disposition: form-data; name=\"MAX_FILE_SIZE\"\n"
        + "\n"
        + "99999999\n"
        ;

      body_fields += "" 
        + "--" + boundary + "\n" 
        + "Content-Disposition: form-data; name=\"Name\"\n"
        + "\n"
        + "test001.jpeg\n"
        ;

      body_file1_pre = ""
        + "--" + boundary + "\n"
        + "Content-Disposition: form-data; name=\"datafile\"; filename=\"test.jpg\"\n"
        + "Content-Type: image/jpeg\n"
        + "\n";
        
      body_file1_post = "\n";
      
      bodysize = theFile.length() + body_fields.length() + body_file1_pre.length() + body_file1_post.length() + body_finish.length();
  
      String cmd_post = ""       
        + "POST " + path + " HTTP/1.0\n"
        + "Content-type: multipart/form-data, boundary=" + boundary + "\n"
        + "Content-length: " + bodysize + "\n"
        + "\n";
  
      wr.write( cmd_post);
      wr.write( body_fields);
      wr.write( body_file1_pre);
      wr.flush();
      raw.write( theData);
      raw.flush();
      wr.write( body_file1_post);
      wr.write( body_finish);
      wr.flush();

HTTP ist ganz sauber zu setzen, ansonsten passt es nicht (keine Daten, falsche Daten, abgeschnittene daten oder ein auf daten wartender Server). Darüber hinaus sollte man schon ein Feld "Name" mitgeben, wenn man es auslesen will. Das fehlte zusätzlich.

Gruß,
Jumper, the II.
 
Hatte gestern es noch anders Probiert hier der Code:
Code:
if(selectedFiles != null) 
    {   [URL="http://www.google.com/search?q=allinurl%3Aurl+java.sun.com&bntl=1"]URL[/URL] url=null; 
        try{ 
                url=new [URL="http://www.google.com/search?q=allinurl%3Aurl+java.sun.com&bntl=1"]URL[/URL]("http://localhost/testphp.php");//+ "?Name=" + sb.toString());  
                } 
                catch([URL="http://www.google.com/search?q=allinurl%3Amalformedurlexception+java.sun.com&bntl=1"]MalformedURLException[/URL] me){} 
                try{        
                          [URL="http://www.google.com/search?q=allinurl%3Ahttpurlconnection+java.sun.com&bntl=1"]HttpURLConnection[/URL] con; 
                          [URL="http://www.google.com/search?q=allinurl%3Aoutputstream+java.sun.com&bntl=1"]OutputStream[/URL] oStream; 
                          [URL="http://www.google.com/search?q=allinurl%3Astring+java.sun.com&bntl=1"]String[/URL] parametersAsString; 
                          byte[] parameterAsBytes; 
                          [URL="http://www.google.com/search?q=allinurl%3Astring+java.sun.com&bntl=1"]String[/URL] aLine; // only if reading response 
 
                          parametersAsString = "Name=" + sb.toString(); 
                          parameterAsBytes = parametersAsString.getBytes(); 
                          // send parameters to server 
                          con = ([URL="http://www.google.com/search?q=allinurl%3Ahttpurlconnection+java.sun.com&bntl=1"]HttpURLConnection[/URL]) url.openConnection(); 
                          con.setDoOutput(true); 
                          con.setDoOutput(true); 
                        // setDoInput(true); // only if reading response                           
                          con.setRequestProperty("Content=length", [URL="http://www.google.com/search?q=allinurl%3Astring+java.sun.com&bntl=1"]String[/URL].valueOf(parameterAsBytes.length)); 
                          oStream = con.getOutputStream(); 
                          oStream.write(parameterAsBytes); 
                           
                          getAppletContext().showDocument(url,"_self"); 
                          oStream.flush(); 
                          oStream.close();  
                 
                          oStream.flush(); 
                          // read response from server 
                          [URL="http://www.google.com/search?q=allinurl%3Abufferedreader+java.sun.com&bntl=1"]BufferedReader[/URL] in = new [URL="http://www.google.com/search?q=allinurl%3Abufferedreader+java.sun.com&bntl=1"]BufferedReader[/URL](new [URL="http://www.google.com/search?q=allinurl%3Ainputstreamreader+java.sun.com&bntl=1"]InputStreamReader[/URL](con.getInputStream())); 
                          aLine = in.readLine(); 
                          while (aLine != null) 
                          { [URL="http://www.google.com/search?q=allinurl%3Asystem+java.sun.com&bntl=1"]System[/URL].out.println(aLine); 
                            aLine = in.readLine(); 
                          } 
                           
                          in.close(); 
                          oStream.close();  
                           
                         
                }

und das ergebnis:

HTML:
<!doctype html public "-//W3C//DTD HTML 4.0 //EN">
<html>
<head>
       <title>Title here!</title>
</head>
<body> 
<h1>HTML Ausgabe</h1>
<h1>PHP Ausgabe</h1>
<hr/>
ausgabe1:C:\\Dokumente und Einstellungen\\fox\\Eigene Dateien\\buecherseiten.jpg

ausgabe2:
ausgabe3:
ausgabe4:C:\\Dokumente und Einstellungen\\fox\\Eigene Dateien\\buecherseiten.jpg

</body>
</html>

Ich kann mit der Seite kommunizieren, sie antwortet wenigstens.
Aber das klappt auch nur in Eclipse in der Konsole wenn ich die Jar exportiere, signiere und einer Html Seite aufrufe, komme ich auf die andere Seite aber die Postvariablen kommen nicht an.

Ich glaube es liegt am
Code:
getAppletContext().showDocument(url,"_self");
Aber ich bin ratlos was ich verändern sollte und noch probieren könnte. :(
 
Hallo,

sorry, aber mir entzieht sich jetzt der logische Zusammenhang von diesem Code zum vorherigen .... Immerhin hatte ich zuvor eine komplette Datei hochgeladen. Aber was solls.

Zu deiner Frage.
a) Hast Du dem Applet in deiner HTML-Seite mitgegeben, dass es script-fähig ist?
HTML:
<PARAM NAME = "scriptable" VALUE = "true">
b) Was sagt die Java Console im Browser? Ewtl. eine Fehlermeldung?


Gruß,
Jumper, the II.
 
Werbung:
Hallo,

sorry, aber mir entzieht sich jetzt der logische Zusammenhang von diesem Code zum vorherigen .... Immerhin hatte ich zuvor eine komplette Datei hochgeladen. Aber was solls.

Zu deiner Frage.
a) Hast Du dem Applet in deiner HTML-Seite mitgegeben, dass es script-fähig ist?
HTML:
<PARAM NAME = "scriptable" VALUE = "true">
b) Was sagt die Java Console im Browser? Ewtl. eine Fehlermeldung?


Gruß,
Jumper, the II.

Der Code von vorhin den ich gepostet habe war nur der Test von gestern, hier noch der eigentliche Code nach deinen Verbesserungen
Code:
private void btnabschickenActionPerformed(java.awt.event.ActionEvent evt) {
    if(selectedFiles != null)
    {   
            URL url=null;
            try{
                url=new URL("http://localhost/testphp.php");//+ "?Name=" + sb.toString()); 
            }
            catch(MalformedURLException me){}
            try{   
                String hostname = "localhost";
                int port = 80;
                InetAddress addr = InetAddress.getByName(hostname);
                Socket socket = new Socket(addr, port);

                // Send header
                String path = "/testphp.php";

                File theFile = new File("C:\\Dokumente und Einstellungen\\fox\\Eigene Dateien\\buecherseiten.jpg");
                System.out.println ("size: " + (int) theFile.length());
                DataInputStream fis = new DataInputStream(new BufferedInputStream(new
                FileInputStream(theFile)));
                byte[] theData = new byte[(int) theFile.length( )];

                fis.readFully(theData);
                fis.close();


                DataOutputStream raw = new
                DataOutputStream(socket.getOutputStream());
                Writer wr = new OutputStreamWriter(raw);
                
                String boundary = "mango";
                  long bodysize = -1;
                  
                  String body_fields = "";
                  String body_finish = "--" + boundary + "--\n";
                  String body_file1_pre = "";
                  String body_file1_post = "";
                  
                  
                  body_fields += "" 
                    + "--" + boundary + "\n" 
                    + "Content-Disposition: form-data; name=\"MAX_FILE_SIZE\"\n"
                    + "\n"
                    + "99999999\n"
                    ;

                  body_fields += "" 
                    + "--" + boundary + "\n" 
                    + "Content-Disposition: form-data; name=\"Name\"\n"
                    + "\n"
                    + "test001.jpeg\n"
                    ;

                  body_file1_pre = ""
                    + "--" + boundary + "\n"
                    + "Content-Disposition: form-data; name=\"datafile\"; filename=\"test.jpg\"\n"
                    + "Content-Type: image/jpeg\n"
                    + "\n";
                    
                  body_file1_post = "\n";
                  
                  bodysize = theFile.length() + body_fields.length() + body_file1_pre.length() + body_file1_post.length() + body_finish.length();
              
                  String cmd_post = ""       
                    + "POST " + path + " HTTP/1.0\n"
                    + "Content-type: multipart/form-data, boundary=" + boundary + "\n"
                    + "Content-length: " + bodysize + "\n"
                    + "\n";
              
                  wr.write( cmd_post);
                  wr.write( body_fields);
                  wr.write( body_file1_pre);
                  wr.flush();
                  raw.write( theData);
                  raw.flush();
                  wr.write( body_file1_post);
                  wr.write( body_finish);
                  wr.flush();
                
                     wr.write(cmd_post);
                   
                     wr.flush();
                     raw.write(theData);
                     raw.flush( );
                     wr.write("\r\n--mango--\r\n");
                     wr.flush( );
                   
                     BufferedReader rd = new BufferedReader(new
                     InputStreamReader(socket.getInputStream()));
                     String line;
                     System.out.println("rueckgabe");
                     while ((line = rd.readLine()) != null) {
                         System.out.println(line);
                     }
                     getAppletContext().showDocument(url);
                     wr.close();
                     raw.close();
                   
                   
                     socket.close();
                     } catch (Exception e) { System.out.println(e.toString()); }
    }
}
:

Die Java Konsole gibt mir:

Code:
----------------------------------------------------
c:   Konsole löschen
f:   Objekte in Finalisierungswarteschlange finalisieren
g:   Speicherbereinigung
h:   Diese Hilfemeldung anzeigen
l:   ClassLoader-Liste ausgeben
m:   Speicherbelegung anzeigen
o:   Protokollierung auslösen
p:   Proxy-Konfiguration neu laden
q:   Konsole ausblenden
r:   Richtlinien-Konfiguration neu laden
s:   System- und Bereitstellungseigenschaften ausgeben
t:   Threadliste ausgeben
v:   Thread-Stack ausgeben
x:   ClassLoader-Cache löschen
0-5: Trace-Stufe auf <n> setzen
----------------------------------------------------

C:\Dokumente und Einstellungen\fox\Eigene Dateien\buecherseiten.jpg
size: 17877
rueckgabe
HTTP/1.1 200 OK
Date: Wed, 06 Aug 2008 10:30:26 GMT
Server: Apache/2.2.9 (Win32) DAV/2 mod_ssl/2.2.9 OpenSSL/0.9.8h mod_autoindex_color PHP/5.2.6
X-Powered-By: PHP/5.2.6
Set-Cookie: PHPSESSID=bdc9d632f773f3be47557bc3c605cc65; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 243
Connection: close
Content-Type: text/html

<!doctype html public "-//W3C//DTD HTML 4.0 //EN">
<html>
<head>
       <title>Title here!</title>
</head>
<body> 
<h1>HTML Ausgabe</h1>
<h1>PHP Ausgabe</h1>
<hr/>
ausgabe1:test001.jpeg
ausgabe2:
ausgabe3:test001.jpeg
</body>
</html>
Aber auf der Seite selber erhalte ich nichts. Wie kann das sein?
 
Hallo,

der rote Teil ist doppelt und muss raus :-)

Code:
private void btnabschickenActionPerformed(java.awt.event.ActionEvent evt) {
    if(selectedFiles != null)
    {   
            URL url=null;
            try{
                url=new URL("http://localhost/testphp.php");//+ "?Name=" + sb.toString()); 
            }
            catch(MalformedURLException me){}
            try{   
                String hostname = "localhost";
                int port = 80;
                InetAddress addr = InetAddress.getByName(hostname);
                Socket socket = new Socket(addr, port);

                // Send header
                String path = "/testphp.php";

                File theFile = new File("C:\\Dokumente und Einstellungen\\fox\\Eigene Dateien\\buecherseiten.jpg");
                System.out.println ("size: " + (int) theFile.length());
                DataInputStream fis = new DataInputStream(new BufferedInputStream(new
                FileInputStream(theFile)));
                byte[] theData = new byte[(int) theFile.length( )];

                fis.readFully(theData);
                fis.close();


                DataOutputStream raw = new
                DataOutputStream(socket.getOutputStream());
                Writer wr = new OutputStreamWriter(raw);
                
                String boundary = "mango";
                  long bodysize = -1;
                  
                  String body_fields = "";
                  String body_finish = "--" + boundary + "--\n";
                  String body_file1_pre = "";
                  String body_file1_post = "";
                  
                  
                  body_fields += "" 
                    + "--" + boundary + "\n" 
                    + "Content-Disposition: form-data; name=\"MAX_FILE_SIZE\"\n"
                    + "\n"
                    + "99999999\n"
                    ;

                  body_fields += "" 
                    + "--" + boundary + "\n" 
                    + "Content-Disposition: form-data; name=\"Name\"\n"
                    + "\n"
                    + "test001.jpeg\n"
                    ;

                  body_file1_pre = ""
                    + "--" + boundary + "\n"
                    + "Content-Disposition: form-data; name=\"datafile\"; filename=\"test.jpg\"\n"
                    + "Content-Type: image/jpeg\n"
                    + "\n";
                    
                  body_file1_post = "\n";
                  
                  bodysize = theFile.length() + body_fields.length() + body_file1_pre.length() + body_file1_post.length() + body_finish.length();
              
                  String cmd_post = ""       
                    + "POST " + path + " HTTP/1.0\n"
                    + "Content-type: multipart/form-data, boundary=" + boundary + "\n"
                    + "Content-length: " + bodysize + "\n"
                    + "\n";
              
                  wr.write( cmd_post);
                  wr.write( body_fields);
                  wr.write( body_file1_pre);
                  wr.flush();
                  raw.write( theData);
                  raw.flush();
                  wr.write( body_file1_post);
                  wr.write( body_finish);
                  wr.flush();
                
                     [COLOR="Red"]wr.write(cmd_post);
                   
                     wr.flush();
                     raw.write(theData);
                     raw.flush( );
                     wr.write("\r\n--mango--\r\n");
                     wr.flush( );[/COLOR]
                   
                     BufferedReader rd = new BufferedReader(new
                     InputStreamReader(socket.getInputStream()));
                     String line;
                     System.out.println("rueckgabe");
                     while ((line = rd.readLine()) != null) {
                         System.out.println(line);
                     }
                     getAppletContext().showDocument(url);
                     wr.close();
                     raw.close();
                   
                   
                     socket.close();
                     } catch (Exception e) { System.out.println(e.toString()); }
    }
}

Wieso allerdings die Umschaltung nicht funktioniert, ist mir nicht ganz klar. Welchen Browser nimmst Du? Vielleicht hilft auch einfach, im Code vor und nach showDocument eine Ausgabe zu setzen, um das Verhalten dokumentiert zu bekommen ....

Gruß,
Jumper, the II.

/EDIT:
PS: nach Einbauen von showDocument hat meine Lösung auch funktioniert ...
 
Zuletzt bearbeitet:
:oops: ok das Doppelte ist draussen. Ich benutzte den FireFox aber beim InternetExplorer hab ich das gleiche Ergebnis. Ein Freund meinte ich sollte bei php ein bytestream empfangen und keinen POST Parameter aber warum gibt die Konsole dann das richtige aus?
 
Werbung:
Hallo,

:oops: ok das Doppelte ist draussen. Ich benutzte den FireFox aber beim InternetExplorer hab ich das gleiche Ergebnis. Ein Freund meinte ich sollte bei php ein bytestream empfangen und keinen POST Parameter aber warum gibt die Konsole dann das richtige aus?

Trennen wir die Fragen ...
1. Bytestream. Selbstverständlich können wir auch nur einen einfachen Bytestream schicken. Allerdings sollte man dann auf der Serverseite mittels eines SocketListeners auf einen Port diesen empfangen. Stichwort für PHP auf dem Server: PHP: socket_listen & Co. Dann brauchst Du auch nicht mehr darauf achten, dass die HTTP-Syntax eingehalten wird. Allerdings kannst Du auch kein POST mehr auswerten.
2. Wo wird kein POST gezeigt? Wechselt er doch die Seite im Browser? Wenn ja, ist das alles klar. Du erklärst mit showDocument den Browser, dass er eine neue Seite aufrufen soll. Das ist wie das anklicken eines <a href=...> Tags. Da kann er Dir keine weiteren POST-Parameter auswerten, die Du in Java gesendet hattest. Java verhält sich hier wie ein eigener kleiner Browser.
Wenn Du jetzt die Umschaltung realisieren willst, musst Du den Status auf dem Server bei Anfrage aus Java zwischenspeichern und dem Link in showDocument eine Kennung mitgeben, damit das Script erkennen kann, dass a) ein Versenden aus Java erfolgte und b) eindutig zuordnen kann, welche Daten du gesendet hattest.

Damit es etwas schwieriger wird, empfehle ich die Generierung einer zufälligen ID, die dann per GET-Parameter mitgegeben wird. Die ID sollte Serverseitig einen Timeout haben, mt dem ggf. auch die hochgeladene Datei mit den Daten entsorgt wird.
Alternativ zur ID kann man natürlich auch die Session-ID verwenden. Aber beachten, showDocument gestattet auch nicht das Setzen von Cookies ... also auch hier per GET-Parameter übergeben und ggf. im PHP Script ins Cookie übernehmen.

Gruß,
Jumper, the II.
 
...
2. Wo wird kein POST gezeigt? Wechselt er doch die Seite im Browser? Wenn ja, ist das alles klar. Du erklärst mit showDocument den Browser, dass er eine neue Seite aufrufen soll. Das ist wie das anklicken eines <a href=...> Tags. Da kann er Dir keine weiteren POST-Parameter auswerten, die Du in Java gesendet hattest. Java verhält sich hier wie ein eigener kleiner Browser.
Wenn Du jetzt die Umschaltung realisieren willst, musst Du den Status auf dem Server bei Anfrage aus Java zwischenspeichern und dem Link in showDocument eine Kennung mitgeben, damit das Script erkennen kann, dass a) ein Versenden aus Java erfolgte und b) eindutig zuordnen kann, welche Daten du gesendet hattest.

Damit es etwas schwieriger wird, empfehle ich die Generierung einer zufälligen ID, die dann per GET-Parameter mitgegeben wird. Die ID sollte Serverseitig einen Timeout haben, mt dem ggf. auch die hochgeladene Datei mit den Daten entsorgt wird.
Alternativ zur ID kann man natürlich auch die Session-ID verwenden. Aber beachten, showDocument gestattet auch nicht das Setzen von Cookies ... also auch hier per GET-Parameter übergeben und ggf. im PHP Script ins Cookie übernehmen.

Gruß,
Jumper, the II.
Ja, der Browser wechselt die Seite. Und du hast wohl recht das er die Daten nicht erhalten kann, weil es 2 request erhält einmal wo die Postdaten verschickt und erhalten werden und einmal wo nur die Seite aufgerufen wird.

Muss ich jetzt ein directory erstellen für jeden User wo die Bilder gespeichert werden und dann wenn ich auf der Seite ankomm mit dem GETparameter überprüfen?

ps: Danke für deine hilfe ;)
 
Hallo,

bevor es jetzt weiter geht ... was genau willst Du mit dem Versenden per Java Applet und anschließend per PHP erreichen?

Gruß,
Jumper, the II.
 
Werbung:
Hi, ich versuche über einen JFileChooser Bilder auszuwählen um diese dann anschliessend an eine PHP Seite zu übermitteln um diese von dort aus auf einen FTP Server hochzuladen und die Dateinamen auch in einer SQL Datenbank zu speichern.
 
Naja ... dann hast Du doch schon fast alles.

Dein PHP muss also neben den Annehmen und Speichern der Datei am besten eine SessionID erzeugen und die auch an das Java-Applet zurück geben. Das Java Applet selber extrahiert die SessionID und gibt sei beim aufuf der Seite als GET-Parameter weiter ?SESSID=xxxxxxxx.

Serverseitig muss die SessionID am besten in einer Datenbank vorgehalten und m.E. im Übergang zum Browser mit einer recht kurzen Verfallszeit ausgestattet werden.

Die Dateien werden je nach Wunsch mit einem Namen versehen und abgespeichert. Ein eigenes Verzeichnis je Nutzer ist möglich. Fragt sich einfach, obs not tut. In der Datenbank zu den hochgeladenen Dateien werden sie, wenn notwendig, mit der SessionID verknüpft, um den Bezug zu wahren. Nicht bestätigte Uploads werden dabei automatisch entfernt. Ansonsten könnte jeder was hochladen und den Server zufahren. Entsprechende Auto-Uploader gibt es ja zuhauf. Und inwiefern ein möglicherweise auf diese Weise hochgeladenes PHP-Script als Einfallspunkt dienen kann, betrachte ich jetzt erst einmal auch nicht.

Also insgesamt kein größeres Problem.

Gruß,
Jumper, the II.
 
Naja ... dann hast Du doch schon fast alles.

Dein PHP muss also neben den Annehmen und Speichern der Datei am besten eine SessionID erzeugen und die auch an das Java-Applet zurück geben. Das Java Applet selber extrahiert die SessionID und gibt sei beim aufuf der Seite als GET-Parameter weiter ?SESSID=xxxxxxxx.

Serverseitig muss die SessionID am besten in einer Datenbank vorgehalten und m.E. im Übergang zum Browser mit einer recht kurzen Verfallszeit ausgestattet werden.

Die Dateien werden je nach Wunsch mit einem Namen versehen und abgespeichert. Ein eigenes Verzeichnis je Nutzer ist möglich. Fragt sich einfach, obs not tut. In der Datenbank zu den hochgeladenen Dateien werden sie, wenn notwendig, mit der SessionID verknüpft, um den Bezug zu wahren. Nicht bestätigte Uploads werden dabei automatisch entfernt. Ansonsten könnte jeder was hochladen und den Server zufahren. Entsprechende Auto-Uploader gibt es ja zuhauf. Und inwiefern ein möglicherweise auf diese Weise hochgeladenes PHP-Script als Einfallspunkt dienen kann, betrachte ich jetzt erst einmal auch nicht.

Also insgesamt kein größeres Problem.

Gruß,
Jumper, the II.

Hm OK, Also muss ich jetzt per PHP die Bilder empfangen. Ich denke mal mit
PHP:
POST["filename"]
erhalte ich die Bilder und speichere sie dann lokal bei htdocs. Dann muss ich die Sessionid, die ich per GET erhalte überprüfen ob sie richtig ist und wenn sie es ist wird in die Datenbank die Namen der Bilder zu den jeweiligen User geschrieben sowie die Bilder hochgeladen werden. Oder?
 
Zuletzt bearbeitet:
Werbung:
Fast .. $_FILES ist dein Freund :-) und natürlich PHP Manual

Gruß,
Jumper, the II.

Achso, vielleicht so?:
PHP:
    $uploaddir = '/tmp/';
    
    print "<pre>";
    //if (move_uploaded_file($_FILES['filename'], $uploaddir . $_FILES['filename'])) {
    if(move_uploaded_file($_FILES['filename']['tmp_name'], $uploaddir . $_FILES['userfile'][$name])) {
           print "File is valid, and was successfully uploaded.  Here's some more debugging info:\n";
           print_r($_FILES);
    } else {
           print "Possible file upload attack!  Here's some debugging info:\n";
           print_r($_FILES);
}
Aber noch ist was falsch, er geht immer in den Else-Zweig rein.

Edit: Hab ein wenig rumprobiert und kann jetzt ein Bild lokal speichern, aber wie siehts mit mehreren Dateien aus? Mit dem Filechooser vom Applet kann man mehrere auswählen aber nur eines kommt an.

PHP:
for($i=0; $i<= count($FILES['datafile']['name']);$i++){
            {    
                echo "$i Durchlauf\n";
                if(move_uploaded_file($_FILES['datafile']['tmp_name'][$i], "phpBilderupload/$verz/".$_FILES['datafile']['name'][$i] )) {
                   print "File is valid, and was successfully uploaded.  Here's some more debugging info:\n";
                   print_r($_FILES);
                } else {
                   print "Possible file upload attack!  Here's some debugging info:\n";
                   print_r($_FILES);
                   
                }
            }
Hab den Javacode auch geändert damit es mehrere Bilder verschickt:
Code:
body_fields += "" 
                    + "--" + boundary + "\n" 
                    + "Content-Disposition: form-data; name=\"MAX_FILE_SIZE\"\n"
                    + "\n"
                    + "99999999\n"
                    ;

                  body_fields += "" 
                    + "--" + boundary + "\n" 
                    + "Content-Disposition: form-data; name=\"Name\"\n"
                    + "\n" + sb.toString() 
                    + "\n"
                    ;

                  body_file1_pre = ""//sendFiles(selectedFiles);
                    + "--" + boundary + "\n"
                    + "Content-Disposition: form-data; name=\"datafile[]\"; " 
                    + sendFiles(selectedFiles)

private String sendFiles(String [] value)
{    
    StringBuilder send = new StringBuilder("");
    for(String s:value)
    {
        send.append("filename=\"" + s + "\"\n");
        send.append("Content-Type: image/jpeg\n");
        send.append("\n");
    }
    return send.toString();
}
Hast du eine Idee warum es nicht klappt?
 
Zuletzt bearbeitet:
Neueste Version Java:
Code:
private void btnabschickenActionPerformed(java.awt.event.ActionEvent evt) {
    if(selectedFiles != null)
    {   
        if(endsWith(selectedFiles)){
            URL url=null;
            try{
                url=new URL("http://localhost/testphp.php");//+ "?Name=" + sb.toString()); 
            }
            catch(MalformedURLException me){}
            try{   
                String hostname = "localhost";
                int port = 80;
                InetAddress addr = InetAddress.getByName(hostname);
                Socket socket = new Socket(addr, port);
                DataOutputStream raw = new
                DataOutputStream(socket.getOutputStream());
                Writer wr = new OutputStreamWriter(raw);
                DataInputStream fis = null;
                byte[] theData = null;

                // Send header
                String path = "/testphp.php";
                
                
              String body_fields = "";
              String body_finish = "";
              String body_file1_pre = "";
              String body_file1_post = ""; 
              String cmd_post = "";
                
                for(int i=0; i<selectedFiles.length;i++)
                {
                String bildfile =selectedFiles[i];//"C:\\Dokumente und Einstellungen\\fox\\Eigene Dateien\\buecherseiten.jpg" ;
                File theFile  = files[i];//new File(bildfile);
                System.out.println ("size: " + (int) theFile.length());
                fis = new DataInputStream(new BufferedInputStream(new FileInputStream(theFile)));
                theData = new byte[(int) theFile.length( )];

                fis.readFully(theData);
                fis.close();
                
                String boundary = "mango";
                  long bodysize = 0;
                  
                  body_fields = "";
                  body_finish = "--" + boundary + "--\n";
                  body_file1_pre = "";
                  body_file1_post = ""; 
                  
                  body_fields = "" 
                    + "--" + boundary + "\n" 
                    + "Content-Disposition: form-data; name=\"Name\"\n"
                    + "\n" + sb.toString() 
                    + "\n"
                    ;
                  
                  body_fields += "" 
                    
                      + "--" + boundary + "\n" 
                      + "Content-Disposition: form-data; name=\"MAX_FILE_SIZE\"\n"
                      + "\n"
                      + "99999999\n"
                      ;

                  body_file1_pre = ""   //  + bodyFile1Pre(selectedFiles)
                    + "--" + boundary + "\n"
                     + "Content-Disposition: form-data; name=\"datafile[]\"; " 
                    +    "filename=\"" + bildfile + "\"\n"
                    + "Content-Type: image/jpeg\n"
                    + "\n"
                    ;
                    
                  body_file1_post = "\n";
                  
                  bodysize = theFile.length() + body_fields.length() + body_file1_pre.length() + body_file1_post.length() + body_finish.length();
                                                      
                  cmd_post = ""       
                    + "POST " + path + " HTTP/1.0\n"
                    + "Content-type: multipart/form-data, boundary=" + boundary + "\n"
                    + "Content-length: " + bodysize + "\n"
                    + "\n";
                  
                  wr.write( cmd_post);
                  wr.write( body_fields);
                  wr.write( body_file1_pre);
                }
                  wr.flush();
                
                  raw.write( theData);
                  raw.flush();
                  wr.write( body_file1_post);
                  wr.write( body_finish);
                  wr.flush();
                  
                  
                     BufferedReader rd = new BufferedReader(new
                     InputStreamReader(socket.getInputStream()));
                     String line;
                     System.out.println("Rueckgabe\n!---------------!\n");
                     while ((line = rd.readLine()) != null) {
                         System.out.println(line);
                     }
                     getAppletContext().showDocument(url);
                     wr.close();
                     raw.close();
                     socket.close();
                     } catch (Exception e) { System.out.println(e.toString()); }
        }
    }
}
PHP Version
PHP:
for($i=0; $i< count($_FILES['datafile']['tmp_name']);$i++) //($_FILES['datafile']);$i++)
            {    
                echo "$i Durchlauf\n";
                if(move_uploaded_file($_FILES['datafile']['tmp_name'][$i], "phpBilderupload/$verz/".$_FILES['datafile']['name'][$i] )) {
                   print "File is valid, and was successfully uploaded.  Here's some more debugging info:\n";
                   print_r($_FILES);
                } else {
                   print "Possible file upload attack!  Here's some debugging info:\n";
                   print_r($_FILES);                   
                }
            }
Bei einem Bild gehts auch super aber wenn ich mehrere Bilder auswähle gehts nicht.
Und die Ausgabe von einem Bild, wo es funktioniert:
HTML:
HTTP/1.1 200 OK
Date: Fri, 08 Aug 2008 13:29:04 GMT
Server: Apache/2.2.9 (Win32) DAV/2 mod_ssl/2.2.9 OpenSSL/0.9.8h mod_autoindex_color PHP/5.2.6
X-Powered-By: PHP/5.2.6
Set-Cookie: PHPSESSID=90a566a9fb2fdbbf1eea9043cdefc93d; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 1139
Connection: close
Content-Type: text/html

<!doctype html public "-//W3C//DTD HTML 4.0 //EN">
<html>
<head>
       <title>Title here!</title>
</head>
<body> 
<PARAM NAME = "scriptable" VALUE = "true">
<h1>HTML Ausgabe</h1>
    
    
<br/><form method="POST" action="http://localhost/testphp.php?id=596"<input type="text" name="Name"><input type="submit"></form>ausgabe GET: 
<br>ausgabe POST: buecherseiten.jpg

==========================================================================
0 Durchlauf
File is valid, and was successfully uploaded.  Here's some more debugging info:
Array
(
    [datafile] => Array
        (
            [name] => Array
                (
                    [0] => buecherseiten.jpg
                )

            [type] => Array
                (
                    [0] => image/jpeg
                )

            [tmp_name] => Array
                (
                    [0] => C:\xampp\tmp\phpC1.tmp
                )

            [error] => Array
                (
                    [0] => 0
                )

            [size] => Array
                (
                    [0] => 17877
                )

        )

)
</body>
</html>
 
Werbung:
Nachtrag::

Und die Ausgabe wenn ich mehrere Bilder auswähle:

HTML:
HTTP/1.1 200 OK
Date: Fri, 08 Aug 2008 13:30:23 GMT
Server: Apache/2.2.9 (Win32) DAV/2 mod_ssl/2.2.9 OpenSSL/0.9.8h mod_autoindex_color PHP/5.2.6
X-Powered-By: PHP/5.2.6
Set-Cookie: PHPSESSID=7f28478eb7d6ce9b35c48ef3be27879f; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 3522
Connection: close
Content-Type: text/html

<!doctype html public "-//W3C//DTD HTML 4.0 //EN">
<html>
<head>
       <title>Title here!</title>
</head>
<body> 
<PARAM NAME = "scriptable" VALUE = "true">
<h1>HTML Ausgabe</h1>
    
    
<br/><form method="POST" action="http://localhost/testphp.php?id=893"<input type="text" name="Name"><input type="submit"></form>ausgabe GET: 
<br>ausgabe POST: Sonnenuntergang.jpg
Wasserlilien.jpg
Winter.jpg

==========================================================================
0 Durchlauf
File is valid, and was successfully uploaded.  Here's some more debugging info:
Array
(
    [datafile] => Array
        (
            [name] => Array
                (
                    [0] => Sonnenuntergang.jpg
                    [1] => Wasserlilien.jpg
                    [2] => Winter.jpg
                )

            [type] => Array
                (
                    [0] => image/jpeg
                    [1] => image/jpeg
                    [2] => 
                )

            [tmp_name] => Array
                (
                    [0] => C:\xampp\tmp\phpC2.tmp
                    [1] => C:\xampp\tmp\phpC3.tmp
                    [2] => 
                )

            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 3
                )

            [size] => Array
                (
                    [0] => 99
                    [1] => 100
                    [2] => 0
                )
        )
)
1 Durchlauf
File is valid, and was successfully uploaded.  Here's some more debugging info:
Array
(
    [datafile] => Array
        (
            [name] => Array
                (
                    [0] => Sonnenuntergang.jpg
                    [1] => Wasserlilien.jpg
                    [2] => Winter.jpg
                )

            [type] => Array
                (
                    [0] => image/jpeg
                    [1] => image/jpeg
                    [2] => 
                )

            [tmp_name] => Array
                (
                    [0] => C:\xampp\tmp\phpC2.tmp
                    [1] => C:\xampp\tmp\phpC3.tmp
                    [2] => 
                )

            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 3
                )

            [size] => Array
                (
                    [0] => 99 
                    [1] => 100
                    [2] => 0
                )
        )
)
2 Durchlauf
Possible file upload attack!  Here's some debugging info:
Array
(
    [datafile] => Array
        (
            [name] => Array
                (
                    [0] => Sonnenuntergang.jpg
                    [1] => Wasserlilien.jpg
                    [2] => Winter.jpg
                )

            [type] => Array
                (
                    [0] => image/jpeg
                    [1] => image/jpeg
                    [2] => 
                )

            [tmp_name] => Array
                (
                    [0] => C:\xampp\tmp\phpC2.tmp
                    [1] => C:\xampp\tmp\phpC3.tmp
                    [2] => 
                )
            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 3
                )
            [size] => Array
                (
                    [0] => 99
                    [1] => 100
                    [2] => 0
                )
        )
)
</body>
</html>

Code:
             [size] => Array
                (
                    [0] => 99 
                    [1] => 100
                    [2] => 0
                )
und warum gibt er mir bei der Dateigrösse 99 bytes bzw 100 Bytes an obwohl die Bilder 24.7 kb und 84.2 kb gross sind?

Jemand eine Idee?
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben