WinFuture-Forum.de: Java: Datei Per Post übertragen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Java: Datei Per Post übertragen


#1 Mitglied ist offline   G.I.Joe 

  • Gruppe: aktive Mitglieder
  • Beiträge: 978
  • Beigetreten: 19. September 04
  • Reputation: 0

geschrieben 17. Februar 2007 - 19:12

So, wie in diesem Thread schon angedeutet, bastel ich gerade an einem Java-Programm das per POST eine Datei an ein PHP-Skript sendet. Das Senden geht jetzt auch sauber über die Bühne, und so langsam glaub ich dass eher was auf der Empfängerseite schief geht.
Basierend auf diesem Beispiel habe ich folgenden Java-Code entwickelt (noch ziemlich chaotisch):
try {
			final String hostname = "http://localhost";
			final int port = 80;
			final InetAddress addr = InetAddress.getByName(hostname);
			final Socket socket = new Socket(addr, port);
			final String path = "paramtest.php";
			
			final File theFile = new File("C:/test.txt");
			BufferedReader in = new BufferedReader(new FileReader(theFile));
			
			
			StringBuffer content = new StringBuffer();
			String str;
			while((str = in.readLine()) != null){
				content.append(str + "\r\n");
			}
			
			DataInputStream fis = new DataInputStream(new BufferedInputStream(new
					FileInputStream(theFile)));
					byte[] theData = new byte[(int) theFile.length( )];

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

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

			final String boundary = "\r\n---------------------------" + ((int)(Math.random() * 1000000000)) + "\r\n";
			final String contentdispo = boundary + "Content-Disposition: form-data; name=\"param1\"; filename=\"" + theFile.getName() +"\"\r\n"
				+ "Content-Type: application/octet-stream\r\n";

			String data = "POST /" + path + " HTTP/1.1\r\n"
				+ "Host: " + hostname.replace("http://", "") + "\r\n"
				+ "User-Agent: WhoCares\r\n"
				+ "Accept: */*\r\n"
				+ "Connection: keep-alive\r\n"
				+ "Referer: " + hostname + "/" + path + "\r\n"
				+ "Pragma: no-cache\r\n"
				+ "Content-Type: multipart/form-data; boundary=" + boundary.replace("\r\n", "") + "\r\n"
				+ "Content-Length: " + ((int)theFile.length() + contentdispo.length() + boundary.length()) + "\r\n"
				+ contentdispo + "\r\n";

			System.out.println("\n\n" + data + "<Datei>" + boundary+ "\n\n\n");
			
			wr.write(data);
			wr.flush();
			
			raw.write(theData);
			raw.flush();
			
			wr.write(boundary);
			wr.flush();


			final BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			final String eof = ")";
			for ( String line; (line = rd.readLine()) != null; ){ 
				System.out.println(line);
				if(line.equals(eof))
					break;
			}
			
			raw.close();
			wr.close();
			socket.close();
			rd.close();
		} catch (final Exception e) {
			e.printStackTrace();
		}

Wie man an dem StringBuffer content sieht, hatte ich auch schon versucht die Datei im Klartext mit in den Header zu packen, statt über den DataOutputStream raw zu schreiben, das ändert aber nichts.

Der Code bastelt sich also einen Header und sendet diesen dann. Der Header sieht z.B. so aus:
POST /paramtest.php HTTP/1.1
Host: www.degler-online.de
User-Agent: WhoCares
Accept: */*
Connection: keep-alive
Referer: http://www.degler-online.de/paramtest.php
Pragma: no-cache
Content-Type: multipart/form-data; boundary=---------------------------730438014
Content-Length: 4374

---------------------------730438014
Content-Disposition: form-data; name="param1"; filename="test.txt"
Content-Type: application/octet-stream

<Dateiinhalt>
---------------------------730438014


Auf Webserver-Seite wartet folgendes PHP-Skript, das angeblich alle GET- und POST-Parameter ausgibt:
<?php
  $msg = "";

  $msg .= "Alle GET-Parameter<br>";
  $msg .= "==================<br>";
  $msg .= "<br>";
  foreach ($_GET as $k => $v) {
	$msg .= sprintf("%s<br>  %s<br><br>", $k, $v);
  }

  $msg .= "Alle POST-Parameter<br>";
  $msg .= "===================<br>";
  $msg .= "<br>";
  foreach ($_POST as $k => $v) {
	$msg .= sprintf("%s<br>  %s<br><br>", $k, $v);
  }
 echo $msg;
?>


Aber: Es scheinen keine POST-Parameter anzukommen, die Ausgabe zeigt zumindest nichts. Übertragen wird der Header aber korrekt, sonst würde ich vom Webserver eine Fehlermeldung bekommen.
Leider kenn ich mich auf diesem Gebiet nicht besonders gut aus, weiß von euch jemand weiter?

Ich hab auch schon dieses Beispiel ausprobiert. Auch hier läuft das Senden ohne Probleme ab, auf der Empfänger-Seite tut sich aber nichts.

Dieser Beitrag wurde von G.I.Joe bearbeitet: 17. Februar 2007 - 19:15

Eingefügtes Bild Eingefügtes Bild
0

Anzeige



#2 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 18. Februar 2007 - 11:14

Auf den ersten Blick fällt mir auch nichts verkehrtes auf.

Hast du mal in das access- bzw. error-log des Webservers geschaut, ob da möglicherweise nützliche Informationen stehen?
0

#3 Mitglied ist offline   G.I.Joe 

  • Gruppe: aktive Mitglieder
  • Beiträge: 978
  • Beigetreten: 19. September 04
  • Reputation: 0

geschrieben 18. Februar 2007 - 11:52

Basierend auf HTTPUnit hab ich inzwischen folgende Lösung entwickelt:
		final StringBuffer content = new StringBuffer();
		try{
			final File file = new File("c:/test.txt");
			
			final BufferedReader in = new BufferedReader(new FileReader(file));
			for(String str; (str = in.readLine()) != null; ){
				content.append(str);
			}
		}
		catch(IOException e){
			e.printStackTrace();
		}
		
		
		String uploadURL = "http://www.blablabla.de/posttest.php";
		try{
			WebConversation wc = new WebConversation();
			PostMethodWebRequest request = new PostMethodWebRequest(uploadURL);
			request.setParameter("test", content.toString());
			WebResponse response = wc.getResponse(request);
			if(response.getResponseCode() != 200){ //FEHLER
				System.out.println(response.getText());
			}
		}
		catch(IOException e){
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}

Eigentlich wollte ich für diesen Teil des Programms auf fremde Libraries verzichten, aber die Lösung ist einfach zu gemütlich ;)
Eingefügtes Bild Eingefügtes Bild
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0