HTTP Eigener Http Response für Datei-Download

Kian

Aktives Mitglied
Hallo,

ich versuche gerade einen eigenen kleinen Http-Server zu schreiben.
Es soll lediglich möglich sein Dateien herunterzuladen.
D.h. jemand ruft über den Browser die URL des Servers auf und es öffnet sich im Browser der "Speichern"-Dialog.

So weit bin ich bis jetzt:

Java:
ServerSocket serverSocket  = new ServerSocket(5555);
			
while(true) {
			
	Socket socket = serverSocket.accept();
				
	OutputStream os = socket.getOutputStream();
				
	DataOutputStream dos = new DataOutputStream(os);
				
	dos.writeBytes("HTTP/1.1 200 OK\r\n");
	dos.writeBytes("Content-Disposition: attachment; filename=\"test.txt\"\r\n");
				
	dos.writeBytes("Hello, World!");
				
	dos.flush();
	dos.close();
	socket.close();
}

Das Problem ist nun, unter IE und Chrome lässt sich zwar die Datei herunterladen, diese ist aber leer (kein "Hello, World!").
FF reagiert überhaupt nicht (wahrscheinlich weil keine Daten gelesen werden).

Was muss ich nun tun damit es funktioniert (z.B. Header erweitern, usw.).

Danke.
 
Problem gelöst.

Bevor man den Inhalt der Datei sendet, einfach
Java:
dos. writeBytes("\r\n");
hinzufügen.

Durch die extra Zeile scheint man den HTTP-Header von den Daten zu trennen.
 
Was passiert, wenn es sich nicht um eine Textdatei, sondern eine Binärdatei handelt? 😉
 
Hab' das ganze gleich mit einer Binärdatei getestet.

Java:
ServerSocket serverSocket  = new ServerSocket(5555);
File f = new File("./test.tar.gz");

	while(true) {	
		FileInputStream fis = new FileInputStream(f);
				
		Socket socket = serverSocket.accept();
				
		OutputStream os = socket.getOutputStream();
			
		DataOutputStream dos = new DataOutputStream(os);
				
		dos.writeBytes("HTTP/1.1 200 OK\r\n");
		dos.writeBytes("Content-Disposition: attachment; filename=\"test.tar.gz\"\r\n");
		dos.writeBytes("Content-Length: "+f.length()+"\r\n");

		dos.writeBytes("\r\n");
				
		byte[] buffer = new byte[1024];
				
		int n = 0;
				
		while((n = fis.read(buffer)) != -1) {		
			dos.write(buffer, 0, n);		
		}
				
		fis.close();
		dos.close();
		socket.close();
	}

Konnte die tar.gz empfangen und erfolgreich entpacken.

Hat jemand vielleicht eine bessere Lösung?
 
Zuletzt bearbeitet:

Zurück
Oben