File Download in Spring MVC
In general, in web applications, it is very frequent operation to perform download operation.
If we want to perform Download operation in Spring WEB MVC Application then we have to use the following steps.
1. Prepare a File with “Download” button and with the downloadable resource.
E.g
downloadpage.jsp
<form method="post" action="download"> <img alt="JavaImage" src="/home/ashok/Java.jpg" width="200" height="200"/> <br> <input type="submit" value="Download"/></td> </form>
2. Prepare Controller class
In Controller class and in action method we have to use the following steps.
a. Set Content Type as “APPLICATION/OCTET-STREAM”.
response.setContentType("APPLICATION/OCTET-STREAM);
b. Set “content-disposition” response header to response object.
response.setHeader("Content-Disposition", "attachment;filename=\""+fileName+"\"");
c. Create File and FileInputStream object with the downloadable resource.
File file = new File("/home/ashok/Downloads/Java.jpg"); FileInputStream fis = new FileInputStream(file);
d. Create OutputStream from response object.
OutputStream os = response.getOutputStream();
e. Get bit by bit from FileInputStream and write bit by bit to OutputStream.
int val = fis.read(); while(val != -1) { os.write(val); val = fis.read(); }
E.g
index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Insert title here</title> </head> <body> <jsp:forward page="download"/> </body> </html>
downloadpage.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Insert title here</title> </head> <body> <form method="post" action="download"> <center> <table> <tr> <td><img alt="JavaImage" src="/home/ashok/Java.jpg" width="200" height="200"/></td> </tr> <tr> <td><input type="submit" value="Download"/></td> </tr> </table> </center> </form> </body> </html>
DownloadController.java
import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; @Controller public class DownloadController { @RequestMapping(value = "/download", method = RequestMethod.GET) public String showDownloadPage() { return "downloadpage"; } @RequestMapping(value = "/download", method = RequestMethod.POST) public void download(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("APPLICATION/OCTET-STREAM"); File file = new File("/home/ashok/Downloads/Java.jpg"); FileInputStream fis = new FileInputStream(file); String fileName = file.getName(); response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); OutputStream os = response.getOutputStream(); int val = fis.read(); while (val != -1) { os.write(val); val = fis.read(); } fis.close(); os.close(); } }
ds-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <context:component-scan base-package="com.ashok.spring.mvc.controller"/> <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"> <display-name>MVC</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>ds</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ds</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>