Spring MVC 4 File Download Example

This post shows you how to implement File Download using Spring MVC 4. We will see file download for file internal to application as well external file from file system. Let’s get started.


Main highlights of the posts:

Downloading a file is quite simple and involves following steps.

  • Create an InputStream to the file to be downloaded.
  • Find MIME type of the content of downloaded file.
    – can be of application/pdf, text/html,application/xml,image/png, ..others.
  • Set Content-Type in response(HttpServletResponse) with MIME type found above.
  • Set Content length in response with MIME type found above.
    response.setContentLength(file.getLength());//length in bytes
  • Set Content-Disposition HEADER in response.
    response.setHeader(“Content-Disposition”, “attachment; filename=” + fileName); //With ‘attachement’ File will be downloaded as is. May show a ‘Save as’ dialog based on browser setting.

    response.setHeader(“Content-Disposition”, “inline; filename=” + fileName);//With ‘inline’ browser will try to display content right into broswer for certain contents(imgages,PDF,text,..). For other content types, file will be download directly.

  • Copy bytes from InputStream to OutputStream of response.
  • Once copying done, close input & output stream.

Complete Example is discussed below.

Following technologies being used:

  • Spring 4.2.0.RELEASE
  • Bootstrap v3.3.2
  • Maven 3
  • JDK 1.7
  • Tomcat 8.0.21
  • Eclipse JUNO Service Release 2

Let’s begin.

Project Structure


Declare dependencies in pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <name>Spring4MVCFileDownloadExample Maven Webapp</name>





Create Controller

package com.websystique.springmvc.controller;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLConnection;
import java.nio.charset.Charset;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

public class FileDownloadController {
	private static final String INTERNAL_FILE="irregular-verbs-list.pdf";
	private static final String EXTERNAL_FILE_PATH="C:/mytemp/SpringMVCHibernateManyToManyCRUDExample.zip";

	@RequestMapping(value={"/","/welcome"}, method = RequestMethod.GET)
	public String getHomePage(ModelMap model) {
		return "welcome";

	 * Download a file from 
	 *   - inside project, located in resources folder.
	 *   - outside project, located in File system somewhere. 
	@RequestMapping(value="/download/{type}", method = RequestMethod.GET)
	public void downloadFile(HttpServletResponse response, @PathVariable("type") String type) throws IOException {
		File file = null;
			ClassLoader classloader = Thread.currentThread().getContextClassLoader();
			file = new File(classloader.getResource(INTERNAL_FILE).getFile());
			file = new File(EXTERNAL_FILE_PATH);
			String errorMessage = "Sorry. The file you are looking for does not exist";
			OutputStream outputStream = response.getOutputStream();
		String mimeType= URLConnection.guessContentTypeFromName(file.getName());
			System.out.println("mimetype is not detectable, will take default");
			mimeType = "application/octet-stream";
		System.out.println("mimetype : "+mimeType);
        /* "Content-Disposition : inline" will show viewable types [like images/text/pdf/anything viewable by browser] right on browser 
            while others(zip e.g) will be directly downloaded [may provide save as popup, based on your browser setting.]*/
        response.setHeader("Content-Disposition", String.format("inline; filename=\"" + file.getName() +"\""));

        /* "Content-Disposition : attachment" will be directly download, may provide save as popup, based on your browser setting*/
        //response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", file.getName()));

		InputStream inputStream = new BufferedInputStream(new FileInputStream(file));

        //Copy bytes from source to destination(outputstream in this example), closes both streams.
        FileCopyUtils.copy(inputStream, response.getOutputStream());


This Controller involves two files. One file is internal to application (inside resources), and other file is located on file system external to application. Be sure to change external file path for your project. Only for demonstration purpose, we have included an extra path variable(internal/external) in path. We are using Spring FileCopyUtils utility class to copy stream from source to destination.


package com.websystique.springmvc.configuration;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@ComponentScan(basePackages = "com.websystique.springmvc")
public class HelloWorldConfiguration extends WebMvcConfigurerAdapter{

    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    public void addResourceHandlers(ResourceHandlerRegistry registry) {



package com.websystique.springmvc.configuration;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class HelloWorldInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { HelloWorldConfiguration.class };
    protected Class<?>[] getServletConfigClasses() {
        return null;
    protected String[] getServletMappings() {
        return new String[] { "/" };

Add View

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
	<title>Spring 4 MVC File Download Example</title>
	<link href="<c:url value='/static/css/bootstrap.css' />"  rel="stylesheet"></link>
	<link href="<c:url value='/static/css/app.css' />" rel="stylesheet"></link>
	<div class="form-container">
		<h1>Welcome to FileDownloader Example</h1>
		Click on below links to see FileDownload in action.<br/><br/>
		<a href="<c:url value='/download/internal' />">Download This File (located inside project)</a>  
		<a href="<c:url value='/download/external' />">Download This File (located outside project, on file system)</a>

Build, Deploy & Run Application

Now build the war (either by eclipse as was mentioned in previous tutorials) or via maven command line( mvn clean install). Deploy the war to a Servlet 3.0 container . Since here i am using Tomcat, i will simply put this war file into tomcat webapps folder and click on start.bat inside tomcat/bin directory.

Open browser and browse at http://localhost:8080/Spring4MVCFileDownloadExample


Clink on Second link. External file should be downloaded.


Clink on First link. Internal file [which is a PDF] should be displayed in browser, thanks to Content-Disposition: inline.With inline, if the content can be shown by browser, it will show it in browser.


Now change Content-Disposition from inline to attachment. Build & redeploy. Click on First link.You should see that pdf file is downloaded this time.


That’s it. Next post shows File upload-download a file into database using Spring MVC 4 , Hibernate and MySQL.

Download Source Code


If you like tutorials on this site, why not take a step further and connect me on Facebook , Google Plus & Twitter as well? I would love to hear your thoughts on these articles, it will help me improve further our learning process.

If you appreciate the effort I have put in this learning site, help me improve the visibility of this site towards global audience by sharing and linking this site from within and beyond your network. You & your friends can always link my site from your site on www.websystique.com, and share the learning.

After all, we are here to learn together, aren’t we?

  • Dimple

    can you please do the similar example with Spring MVC REST Backend and angularJS Frontend?

  • Nandhakumar Mani

    how to set /download url with out configured in $routeParams

    • websystique

      Hi, there is no $routeParams used in this post. what exactly did you mean?

  • Robert

    no working

    • websystique

      Hi Robert, what is not working? If you are running it from within IDE, Make sure that your local setup is fine. Have a look at Setup Tomcat+Eclipse if you have issues with the setup.

  • srinivas vishnu

    That was really helpful. Thanks a lot. Here I have a question, how this can be related to REST API ? Following https://spring.io/guides/gs/rest-service/ this tutorial, i was able to return a json object and display using spring boot restful. Can a file be downloaded to the client using the same concept as used in the url shared ?

    • Nandhakumar Mani


  • Pingback: Spring MVC 4 File Upload Example using Servlet 3 MultiPartConfigElement - WebSystique()

  • Pingback: Spring MVC 4 File Upload Example using Commons fileupload - WebSystique()

  • hzms

    hi, i tried change some code above to download file by retrieving a path that has been stored in database. but when click the download button, the access is denied. how can i solve this problem?

    • websystique

      Hi, from your explanation, it seems that you don’t have right permission to read/write on the file system path. Based on your OS, you can set the required permissions.

  • Ishmam

    Hey websys…….following your configuration system..i am stuck to a task.How can i show an image in jsp view???? In configuration,what i have to add??Where????

  • Texan Rock

    where is web.xml and spring xml file?

    • websystique

      It’s Servlet 3.x app, based on Spring Annotation based configuration.So, no web.xml, no spring.xml.

      • Texan Rock

        really i need to update my java jdk 1.8? and tomcat version?

        • websystique

          You don’t have to.You can use either of tomcat 7/8

  • Pingback: Spring MVC 4 FileUpload-Download Hibernate+MySQL Example - WebSystique()