# HTTP-POST-Request mit Anhang über Socket



## Jenoptik (7. Aug 2006)

Hallo,
ich möcht für ein Bilderupload Bilder per POST-Request an einen Webserver schicken, auf dem dann ein PHP-Skript die empfangene File speichert...

Also hab ich versucht mittels Socket den POST-Request zu schicken. Das Foto kommt nun auch an (richtiges Format usw.) aber wenn man das empfangene Bild öffnet sieht man nur Artefakte. Ich hab das Originalbild mit dem gesendeten mal im Hex-Editor verglichen: Beim empfangenen sind manche Bytes zu Fragezeichen geworden ?!?!

Vielen Dank im Vorraus....


```
public static void main(String[] args) throws IOException{
		
		Socket sock = new Socket("localhost", 80);
		OutputStream out = sock.getOutputStream();
		InputStream in = sock.getInputStream();
		
		
		// Bildlesen
		BufferedInputStream bildin = new BufferedInputStream( new FileInputStream("foto.jpg"));
		int i;
		String content = "";
		while( (i = bildin.read()) != -1 ){
			content += (char)i;
		}

		
		// HTTP-Request
		String head1 = "POST /dev/develope/java/post.php HTTP/1.0" + "\r\n" +
			"Accept: text/html, image/jpeg, image/gif, */*" + "\r\n" +
			"Accept-Charset: iso-8859-1,*,utf-8" + "\r\n" +
			"Content-type: multipart/form-data; boundary=12345" + "\r\n";
		String body = "--12345\r\n" + 
			"Content-Disposition: form-data;name=\"data\";filename=\"foto.jpg\"" + "\r\n" +
			"Content-Type: image/jpeg" + "\r\n\r\n" + 
			content + "\r\n";
		String head2 = "Content-Length: " + body.length() + "\r\n\r\n";
		String end = "--12345--\r\n";
		
		out.write((head1 + head2 + body + end).getBytes());
		
		in.close();
		out.close();
		sock.close();
	}
```


----------



## Murray (7. Aug 2006)

Ein JPEG-Image ist eine Binärdatei und kann als solche nicht 1:1 in den HTTP-Request eingebunden werden. Binärdaten müssen vorher in entsprechende ASCII-Daten umgewandelt werden; im HTTP-Protokoll wird da normalerweise die Base-64-Kodierung verwendet. Das kann man z.B. mit Apache Commons-Codec bewerkstellingen.

Also: Binärdatei als byte[] (nicht char[]!) einlesen, mit dem Encoder ins Textformat überführen und im Header das Feld "Content-Encoding: base64" setzen.


----------



## moormaster (7. Aug 2006)

Ein Base64 En/Decoder ist auch recht schnell von Hand implementiert:

http://de.wikipedia.org/wiki/Base64

Wenn man dabei Performance benötigt und diese nicht selbst in seinen Algorithmus einbringen kann, kann man sich immernoch nach externen Lösungen umschauen


----------

