# Problem mit HTTP-Dateiübertragung



## Weegel (17. Aug 2009)

Folgendes Problem: Ich habe ienen HTTPserver gebastelt. Der funktioniert soweit auch. Jetzt ist eine Problemstellung, das dieser Server auch statische Dateien übertragen soll, diese dann via HTTP-download auch zum Runterladen bereitstellt. Dies klappt auch wunderbar mit textdateien (test/plain, text/html, etc.), allerdings hat er mit gif, jpg, pdf, etc. ein Problem. 

Wenn ich das richtig sehe, transportiert HTTP (Netzwerktechnik ist nicht mein Spezialgebiet  ) im Content-Teil die Daten, sprich in diesem Fall den Inhalt der Datei, dieser muss also als String in den Content geschrieben werden (wie gesagt, Textdateien gehen einwandfrei!). Soweit ich das sehe, liegt es am Encoding der Datei. Ich habe schon den sun.misc.BASE64Encoder ausprobiert, aber der macht mir auch meine Text-Dateien kaputt. Bräuchte an dieser Stelle also ein wenig Hilfe. 

Unten der relevante Quellcode.


```
this.contentType = this.file.toURL().openConnection()
		.getContentType() + "; charset=base64";
	this.responseCode = 200;
	this.additionalHttpHeaders.setProperty(
			"Content-disposition", 
			"attachment; filename="+this.file.getName());
	FileInputStream fis = new FileInputStream(this.file);
	ByteArrayOutputStream bo = new ByteArrayOutputStream();
	int in = 0;
	while ((in = fis.read()) >= 0) {
		bo.write(in);
	}
	System.out.println(this.file.length());
	System.out.println(bo.size());
	bo.close();
	fis.close();
	this.content = bo.toString("ASCII"); //könnte auch ISO8859_1, usw. drin stehen, funktioniert nicht
```
Anmerkung: this.file ist die angeforderte Datei! weitere Attribute des Objektes hier sind lediglich HTTP-Header Informationen!


----------



## musiKk (17. Aug 2009)

Du kannst eine JPEG-Datei mit dem Content-Type [c]image/jpeg[/c] direkt binär rausschicken. Base64 ist doch dann nicht mehr nötig.


----------



## Weegel (18. Aug 2009)

musiKk hat gesagt.:


> Du kannst eine JPEG-Datei mit dem Content-Type [c]image/jpeg[/c] direkt binär rausschicken. Base64 ist doch dann nicht mehr nötig.



Der Content-Type wird ja oben (Zeile 1) direkt gesetzt, das ist kein Problem. Mein Problem ist, das ich die Bytes nicht richtig in den String geschrieben bekomme, da es da - sehr wahrscheinlich - Probleme mit den nicht druckbaren Zeichen gibt bei der String-Konvertieren. Könnte also durchaus ein Allerweltsproblem sein.


----------



## maki (18. Aug 2009)

Wer binäre Ströme in Strings umwandeln will ist selbst schuld 
Das ist kein Allerweltsproblem, das geht einfach nicht wirklich..


----------



## tuxedo (18. Aug 2009)

Häufig hilft es das Rad nicht neu zu erfinden und gleich zu schauen wie es andere machen. Hier ein minimalistischer HTTP-Server:

http://elonen.iki.fi/code/nanohttpd/NanoHTTPD.java


----------



## Weegel (18. Aug 2009)

OK, habe das Problem selbst gelöst. Es ließ sich umschiffen, indem ich den Content nicht erst in einen String bastel, sondern direkt den Byte-Array weiterreiche.


----------



## HoaX (18. Aug 2009)

Viel Spaß wenn du eine 100mb Datei oder gar noch größer runterladen willst ... 
Meiner Meinung nach solltest du den InputStream weiterreichen, evtl diesen sogar noch gekapselt, dass man die Länge mitgeben kann.


----------

