This Java tutorial describes the steps to write code for a Java servlet that transfers a file from the server to the client (web browser). The user can download the file by clicking on a hyperlink which points to the servlet URL. This would be useful for implementing file download functionality in your web application using Java servlet.

The typical steps are as follows:

NOTES:

Tomcat install directory\conf\web.xml

if (mimeType == null) {			
	mimeType = "application/octet-stream";
} 
response.setHeader("Content-Disposition", "attachment; filename=\"MyFile.mp4\""); 
And following is code of the Java servlet called DownloadFileServlet:

package net.codejava;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadFileServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// reads input file from an absolute path
		String filePath = "E:/Test/Download/MYPIC.JPG";
		File downloadFile = new File(filePath);
		FileInputStream inStream = new FileInputStream(downloadFile);
		
		// if you want to use a relative path to context root:
		String relativePath = getServletContext().getRealPath("");
		System.out.println("relativePath = " + relativePath);
		
		// obtains ServletContext
		ServletContext context = getServletContext();
		
		// gets MIME type of the file
		String mimeType = context.getMimeType(filePath);
		if (mimeType == null) {			
			// set to binary type if MIME mapping not found
			mimeType = "application/octet-stream";
		}
		System.out.println("MIME type: " + mimeType);
		
		// modifies response
		response.setContentType(mimeType);
		response.setContentLength((int) downloadFile.length());
		
		// forces download
		String headerKey = "Content-Disposition";
		String headerValue = String.format("attachment; filename=\"%s\"", downloadFile.getName());
		response.setHeader(headerKey, headerValue);
		
		// obtains response's output stream
		OutputStream outStream = response.getOutputStream();
		
		byte[] buffer = new byte[4096];
		int bytesRead = -1;
		
		while ((bytesRead = inStream.read(buffer)) != -1) {
			outStream.write(buffer, 0, bytesRead);
		}
		
		inStream.close();
		outStream.close();		
	}
}
Configure URL mapping for this servlet in the web deployment descriptor file web.xml as follows:

<servlet>
	<description>This servlet sends file to client</description>
	<display-name>DownloadFileServlet</display-name>
	<servlet-name>DownloadFileServlet</servlet-name>
	<servlet-class>net.codejava.DownloadFileServlet</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>DownloadFileServlet</servlet-name>
	<url-pattern>/DownloadFileServlet</url-pattern>
</servlet-mapping>  
Or use the @WebServlet annotation in Servlet 3.0:

@WebServlet("/DownloadFileServlet")
public class DownloadFileServlet extends HttpServlet {
	// code of the servlet...
}
 

We can invoke the servlet in the following form of URL:

http://localhost:8080/MyWebApp/DownloadFileServlet

The browser should ask the user to download the file as shown in the following screenshot:



Browser asks to save file

 

Related Java File Dowload Tutorials:

 

Other Java Servlet Tutorials:

 


About the Author:

is certified Java programmer (SCJP and SCWCD). He started programming with Java in the time of Java 1.4 and has been falling in love with Java since then. Make friend with him on Facebook and watch his Java videos you YouTube.



Attachments:
Download this file (DownloadFileServlet.java)DownloadFileServlet.java[Source code for servlet]1 kB