# FileUpload HTTP POST



## nrg (18. Nov 2011)

Hallo Zusammen,

komm hier nicht weiter :/. Eine Upload-Methode überträgt via HTTP-POST eine Datei. Das funzt mit Textdateien ganz gut. Nehm ich jetzt z.B. eine PDF kommt leider nichts gescheites bei raus (Datei wird komplett übertragen aber beim binären Vergleich sehe ich schon, dass Deltas vorhanden sind).

(zur Veranschaulichung static):

```
private static String httpPost(URL url, InputStream body) throws IOException {
		OutputStreamWriter osw = null;
		InputStreamReader isr = null;
		try {
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("POST");
			conn.setDoOutput(true);
			conn.setDoInput(true);

			osw = new OutputStreamWriter(conn.getOutputStream());
			int i = 0;
			while ((i = body.read()) != -1)
				osw.write(i);
			osw.flush();

			isr = new InputStreamReader(conn.getInputStream());
			CharBuffer cb = CharBuffer.allocate(DEFAULT_BUFFER_SIZE);
			StringBuilder sb = new StringBuilder();
			while (isr.read(cb) != -1) {
				sb.append(cb.flip());
				cb.clear();
			}
			return sb.toString();		
		} catch (IOException ioe) {
			throw ioe;
		} finally {
			try { osw.close(); } catch (Exception ignore) {}
			try { isr.close(); } catch (Exception ignore) {}
		}
	}
```

Aufruf:

```
String res = httpPost("http://servername:port/bla, new DataInputStream(new FileInputStream(file)));
```

ich weiß, dass man beim Kopieren von Dateien einen FileChannel nimmt. Aber ich kann ja nicht einfach aus dem Outputstream der Connection einen FileChannel machen, oder? Wie mache ich das sonst?

Danke und Grüße
nrg


----------



## nrg (21. Nov 2011)

keiner eine Idee?


----------



## SlaterB (21. Nov 2011)

du musst deine Bytes verlustfrei kodieren, einfach String bzw. char-Interpretation ist nicht gut genug,
Base64 nutzt man wohl typischerweise


----------



## nrg (21. Nov 2011)

ist das nicht Teil der Spezifikation vom HTTP Server? Der muss das ja dann wieder dekodieren. Habe es gerade mit Base64 getestet und da wird die PDF serverseitig auch Base64-kodiert gespeichert... Oder habe ich dich nicht richtig verstanden?


----------



## SlaterB (21. Nov 2011)

auf Serverseite müsste natürlich auch irgendjemand wieder dekodieren,
was du bei mehr oder weniger festen Beteiligten in der Kommunikation machen kannst, kann ich nicht so richtig überblicken,

ich empfehle dazu dann, bescheiden anzufangen EIN kümmerliches Byte erfolgreich zu übertragen,
prüfe ob du jedes Byte übertragen kannst, dabei stört wohl bereits, dass chars nicht negativ sein dürfen,

brauchst du unbedingt einen OutputStreamWriter? direkt in den OutputStream kannst du doch eher richtige Bytes schreiben


----------



## nrg (21. Nov 2011)

ja, kaum lass ich den OutputStream*Writer* weg und es funktioniert . Danke


----------

