[FONT=Arial]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.
[/FONT][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);
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 …
[FONT=Arial]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:
[/FONT][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
Title here!
HTML Ausgabe
PHP Ausgabe
ausgabe1:
ausgabe2:
ausgabe3:
ausgabe4:
[/code]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:
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.
parametersAsString = "Name=" + sb.toString();
parameterAsBytes = parametersAsString.getBytes();
// send parameters to server
con = ([HttpURLConnection](http://www.google.com/search?q=allinurl%3Ahttpurlconnection+java.sun.com&bntl=1)) url.openConnection();
con.setDoOutput(true);
con.setDoOutput(true);
// setDoInput(true); // only if reading response
con.setRequestProperty("Content=length", [String](http://www.google.com/search?q=allinurl%3Astring+java.sun.com&bntl=1).valueOf(parameterAsBytes.length));
oStream = con.getOutputStream();
oStream.write(parameterAsBytes);
getAppletContext().showDocument(url,"_self");
oStream.flush();
oStream.close();
oStream.flush();
// read response from server
[BufferedReader](http://www.google.com/search?q=allinurl%3Abufferedreader+java.sun.com&bntl=1) in = new [BufferedReader](http://www.google.com/search?q=allinurl%3Abufferedreader+java.sun.com&bntl=1)(new [InputStreamReader](http://www.google.com/search?q=allinurl%3Ainputstreamreader+java.sun.com&bntl=1)(con.getInputStream()));
aLine = in.readLine();
while (aLine != null)
{ [System](http://www.google.com/search?q=allinurl%3Asystem+java.sun.com&bntl=1).out.println(aLine);
aLine = in.readLine();
}
in.close();
oStream.close();
}[/CODE]
und das ergebnis:
[HTML]
Title here!
HTML Ausgabe
PHP Ausgabe
ausgabe1:C:\\Dokumente und Einstellungen\\fox\\Eigene Dateien\\buecherseiten.jpg
ausgabe2:
ausgabe3:
ausgabe4:C:\Dokumente und Einstellungen\fox\Eigene Dateien\buecherseiten.jpg
[/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 getAppletContext().showDocument(url,"_self");
Aber ich bin ratlos was ich verändern sollte und noch probieren könnte.
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][/HTML]
b) Was sagt die Java Console im Browser? Ewtl. eine Fehlermeldung?
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 …
: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?
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.
[FONT=Arial]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.
[/FONT]
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.
Hm OK, Also muss ich jetzt per PHP die Bilder empfangen. Ich denke mal mit [php]POST[„filename“][/php] 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?
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);
}[/php]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);
}
}[/php]Hab den Javacode auch geändert damit es mehrere Bilder verschickt:
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();
}
[/code]Hast du eine Idee warum es nicht klappt?
}
[/code]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);
}
} [/php]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
[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?