Beispiel für ein einfaches DownloadServlet

Thomas Darimont

Erfahrenes Mitglied
Hallo!

Weils desöfteren angefragt wird hier mal ein Beispiel wie man Dateien zum Client Streamen kann:

Hier sollte man die getFileToDownload() Methode entsprechend implementieren (Gegebenenfalls noch weitere Parameter hineinreichen etc...)

Code:
package de.tutorials;
 
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.OutputStream;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 /**
  * Servlet Class
  * 
  * @web.servlet name="downloadServlet" display-name="Simple DownloadServlet"
  *			  description="Simple Servlet for Streaming Files to the Clients
  *			  Browser"
  * @web.servlet-mapping url-pattern="/download"
  */
 public class DownloadServlet extends HttpServlet {
 	static final int BUFFER_SIZE = 16384;
 
 	protected void doGet(HttpServletRequest request,
 			HttpServletResponse response) throws ServletException, IOException {
 		File file = getFileToDownload();
 		prepareResponseFor(response, file);
 		streamFileTo(response, file);
 	}
 
 	private File getFileToDownload() {
 		return new File("c:/foo.jar");
 	}
 
 	private void streamFileTo(HttpServletResponse response, File file)
 			throws IOException, FileNotFoundException {
 		OutputStream os = response.getOutputStream();
 		FileInputStream fis = new FileInputStream(file);
 		byte[] buffer = new byte[BUFFER_SIZE];
 		int bytesRead = 0;
 		while ((bytesRead = fis.read(buffer)) > 0) {
 			os.write(buffer, 0, bytesRead);
 		}
 		os.flush();
 		fis.close();
 	}
 
 	private void prepareResponseFor(HttpServletResponse response, File file) {
 		StringBuilder type = new StringBuilder("attachment; filename=");
 		type.append(file.getName());
 		response.setContentLength((int) file.length());
 		response.setContentType("application/octet-stream");
 		response.setHeader("Content-Disposition", type.toString());
 	}
 }

Elemente der web.xml:
Code:
     <servlet>
 	 <description><![CDATA[Simple Servlet for Streaming Files to the Clients Browser]]></description>
  	  <display-name>Simple DownloadServlet</display-name>
  	  <servlet-name>downloadServlet</servlet-name>
  	  <servlet-class>de.tutorials.DownloadServlet</servlet-class>
     </servlet>
  
     <servlet-mapping>
  	  <servlet-name>downloadServlet</servlet-name>
  	  <url-pattern>/download</url-pattern>
     </servlet-mapping>

Aufrufen kann man das ganze (beispielsweise) über:
http://localhost:8080/DER_NAME_DEINER_WEB_APP/download

Gruss Tom
 
Hallo Thomas,

ich habe den Code bei mir getested und es funktioniert fast wie gewünscht.

Das Problem kann aber auch bei meinem Client liegen. Ich nutze keine .jsp sonder lege die angeforderte Datei direkt beim client ab.

Hier ist mein Clientcode:

Code:
byte[] buffer = new byte[18000];
            int read = 0;

            DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
            FileOutputStream out = new FileOutputStream("C:\\DEV\\abc.xml");
            while(true) {
                read = dis.read(buffer);
                if (read == -1) {
                    break;
                }
                out.write(buffer, 0, read);
            }
So erhalte ich aber immer noch ein paar Headerdaten. Das erzeugte file wäre dann so:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Disposition: attachment; filename=XML_test.xml
Content-Type: application/octet-stream
Content-Length: 1494
Date: Mon, 05 May 2008 13:55:36 GMT
Connection: keep-alive

<?xml version="1.0" encoding="UTF-8"?><SSWpacket xmlns:xsi="http://www.w3.org/2001.........................

oder wenn ich prepareRespnseFor() weglasse:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Date: Mon, 05 May 2008 14:05:49 GMT
Connection: close

<?xml......

Wie kann ich verhindern das die Headerdaten mitgesendet werden? das ursprungsfile beginnt mit <?xml......

Hat jemand einen Tip?

Besten Dank
xrax
 
Zuletzt bearbeitet:
Zurück