Spring MVC sample application for downloading files
来源:互联网 发布:algorithm 风格算法 编辑:程序博客网 时间:2024/06/05 15:28
- Details
- Last Updated on 18 March 2014
In this article, we are going to show you how to implement file download functionality in a Spring MVC application. The solution is similar to the one described in the article:Send files from servlet to client for downloading, but is implemented in a Spring MVC application.
The following picture depicts workflow of the sample application we are going to build:
Project structure (Eclipse project):
The file to be downloaded in this application is SpringProject.zip file which resides in the downloads directory which is relative to the application’s directory.
1. Code of download page
Create index.jsp file under WebContent directory with the following HTML code:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<
html
>
<
head
>
<
meta
http-equiv
=
"Content-Type"
content
=
"text/html; charset=ISO-8859-1"
>
<
title
>Download Page</
title
>
</
head
>
<
body
>
<
center
>
<
h2
><
a
href
=
"/download.do"
>Click here to download file</
a
></
h2
>
</
center
>
</
body
>
</
html
>
This page simply shows a link “Click here to download file” with URL points to the relative path:download.do. We’ll configure Spring controller class to handle this URL.
2. Code of Spring controller class
Create FileDownloadController.java file under the source package net.codejava.spring with the following code:
package
net.codejava.spring;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.IOException;
import
java.io.OutputStream;
import
javax.servlet.ServletContext;
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;
@Controller
@RequestMapping
(
"/download.do"
)
public
class
FileDownloadController {
/**
* Size of a byte buffer to read/write file
*/
private
static
final
int
BUFFER_SIZE =
4096
;
/**
* Path of the file to be downloaded, relative to application's directory
*/
private
String filePath =
"/downloads/SpringProject.zip"
;
/**
* Method for handling file download request from client
*/
@RequestMapping
(method = RequestMethod.GET)
public
void
doDownload(HttpServletRequest request,
HttpServletResponse response)
throws
IOException {
// get absolute path of the application
ServletContext context = request.getServletContext();
String appPath = context.getRealPath(
""
);
System.out.println(
"appPath = "
+ appPath);
// construct the complete absolute path of the file
String fullPath = appPath + filePath;
File downloadFile =
new
File(fullPath);
FileInputStream inputStream =
new
FileInputStream(downloadFile);
// get MIME type of the file
String mimeType = context.getMimeType(fullPath);
if
(mimeType ==
null
) {
// set to binary type if MIME mapping not found
mimeType =
"application/octet-stream"
;
}
System.out.println(
"MIME type: "
+ mimeType);
// set content attributes for the response
response.setContentType(mimeType);
response.setContentLength((
int
) downloadFile.length());
// set headers for the response
String headerKey =
"Content-Disposition"
;
String headerValue = String.format(
"attachment; filename=\"%s\""
,
downloadFile.getName());
response.setHeader(headerKey, headerValue);
// get output stream of the response
OutputStream outStream = response.getOutputStream();
byte
[] buffer =
new
byte
[BUFFER_SIZE];
int
bytesRead = -
1
;
// write bytes read from the input stream into the output stream
while
((bytesRead = inputStream.read(buffer)) != -
1
) {
outStream.write(buffer,
0
, bytesRead);
}
inputStream.close();
outStream.close();
}
}
This is a typical Spring controller class which is annotated by Spring MVC annotation types. The methoddoDownload() will receive requests from the client, read the file on server and send it to the client for downloading. Note that, unlike traditional Spring controller’s methods, the methoddoDownload()does not return a view name, because our purpose is to send a file to the client. The method exits as soon as the file is completely transferred to the client.
Recommended Book: Getting started with Spring Framework
3. Code of Spring configuration file
Create spring-mvc.xml file under WebContent\WEB-INF directory with the following content:
<?
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:context
=
"http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<
context:component-scan
base-package
=
"net.codejava.spring"
/>
<!-- your beans declaration goes here -->
</
beans
>
This is a deadly simple Spring configuration file which tells the framework to scan the packagenet.codejava.spring for annotated types (element <context:component-scan />). Of course your application will have some bean definitions, but for the purpose of this application, such configuration is enough to work.
Related Course: The Java Spring Tutorial
4. Code of web.xml
The Spring dispatcher servlet is configured to handle requests in the web.xml file as follows:
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
web-app
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns
=
"http://java.sun.com/xml/ns/javaee"
xmlns:web
=
"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id
=
"WebApp_ID"
version
=
"3.0"
>
<
display-name
>FileDownloadSpringMVC</
display-name
>
<
servlet
>
<
servlet-name
>SpringController</
servlet-name
>
<
servlet-class
>org.springframework.web.servlet.DispatcherServlet</
servlet-class
>
<
init-param
>
<
param-name
>contextConfigLocation</
param-name
>
<
param-value
>/WEB-INF/spring-mvc.xml</
param-value
>
</
init-param
>
<
load-on-startup
>1</
load-on-startup
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>SpringController</
servlet-name
>
<
url-pattern
>*.do</
url-pattern
>
</
servlet-mapping
>
</
web-app
>
Recommended Book: Spring in Action
5. Required jar files
Add the following jar files into the WebContent\WEB-INF\lib directory:
- commons-logging-1.1.1.jar
- spring-beans-3.2.1.RELEASE.jar
- spring-context-3.2.1.RELEASE.jar
- spring-core-3.2.1.RELEASE.jar
- spring-expression-3.2.1.RELEASE.jar
- spring-web-3.2.1.RELEASE.jar
- spring-webmvc-3.2.1.RELEASE.jar
The Commons Logging jar files can be downloaded from Apache Commons Logging, other jar files come from Spring framework 3.2.1 RELEASE download.
Related Course: The Java Spring Tutorial
6. Testing the application
Deploy the application on localhost Tomcat server, type the following URL into browser’s address bar:
http://localhost:8080/FileDownloadSpringMVC/
The download page is displayed:
Click on the link, the browser will ask to download the file:
You can download Eclipse project for this application as well as deployable WAR file in the attachment section below.
NOTES:One may ask why not just putting a file somewhere on the server and give the users a link to download it? Of course that will work, however that is a static way. By handling the file to be downloaded programmatically, we can obtain the following benefits:
- Delivering the files dynamically, based on user’s requests.
- Controlling access to the files: who can download and when the download is available.
- Hiding the actual location of files on the server.
Recommended Book: Spring in Practice
- Spring MVC sample application for downloading files
- ASP.NET MVC Uploading and Downloading Files
- Downloading Files
- spring mvc sample
- Preparing for the Sample Application
- A class which is good for downloading files
- Uploading and Downloading Files
- Spring 3 MVC JSON Sample
- Clean output before downloading files
- [DeploymentService:290066]Error occurred while downloading files from admin server for deployment re
- Error occurred while downloading files from Administration Server for deployment request
- Spring MVC-RAML Synchronizer Sample代码分析
- Spring-MVC配置application-mvc文件
- Spring MVC 上传文件(upload files)
- Sample Application using JSF, Spring 2.0, and Java Persistence APIs
- WAVE Sample Files
- Sample Configuration Files
- ADF Single/Multiple files uploading and downloading
- projecteuler---->problem=21----Amicable numbers
- 使用开源组件smooks解析非标准EDI报文
- MySQL管理员常用命令记录
- 【Hibernate步步为营】--组合映射详解
- The Swift Programming Language
- Spring MVC sample application for downloading files
- C语言生成随机数函数的用法
- C#程序设计之学生信息管理系统
- 【干货】照片也能讲故事:水印相机设计小结
- 个人生活安排
- 线性回归及梯度下降法
- pgsql8.1中文文档截取
- leetcode-3Sum
- mysql学习系列:Error:1005错误之errno:105