最近的项目中用到了文件的上传和下载功能,我觉着这个功能比较重要,因此特意把它提取出来自己进行了尝试。
下面就是springMVC配置环境实现文件上传和下载的具体步骤,供大家参考,具体内容如下
一、 基础配置:
maven导包及配置pom.xml,导包时除开springmvc的基础依赖外,需要导入文件上传下载时用到的commons-io.jsr和commons-fileupload.jar:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
<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" > <modelVersion> 4.0 . 0 </modelVersion> <groupId>filLoadTest</groupId> <artifactId>filLoadTest</artifactId> <packaging>war</packaging> <version> 0.0 . 1 -SNAPSHOT</version> <name>filLoadTest Maven Webapp</name> <url>http: //maven.apache.org</url> <build> <finalName>filLoadTest</finalName> <plugins> <!-- 以下配置可以保证每次强制更新时jre版本不会变化,那我的eclipse4. 4.1 ,maven3. 2.5 为例,如果不设置这个,每次强制更新时jre就会变回 1.5 --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version> 2.3 . 2 </version> <configuration> <source> 1.7 </source> <target> 1.7 </target> <encoding>UTF- 8 </encoding> <compilerArguments> <verbose /> <bootclasspath>${java.home}\lib\rt.jar</bootclasspath> </compilerArguments> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version> 3.8 . 1 </version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version> 4.0 . 6 .RELEASE</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version> 2.2 . 3 </version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version> 2.2 . 3 </version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version> 2.2 . 3 </version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version> 1.3 . 1 </version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version> 2.4 </version> </dependency> </dependencies> </project> |
web.xml基础配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
<? 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_2_5.xsd" id = "WebApp_ID" version = "2.5" > < filter > < description >字符集过滤器</ description > < filter-name >encodingFilter</ filter-name > < filter-class >org.springframework.web.filter.CharacterEncodingFilter</ filter-class > < init-param > < description >字符集编码</ description > < param-name >encoding</ param-name > < param-value >UTF-8</ param-value > </ init-param > </ filter > < filter-mapping > < filter-name >encodingFilter</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > < servlet > < servlet-name >springMVC</ servlet-name > < servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class > < init-param > < param-name >contextConfigLocation</ param-name > < param-value >classpath:spring.xml</ param-value > </ init-param > </ servlet > < servlet-mapping > < servlet-name >springMVC</ servlet-name > < url-pattern >*.do</ url-pattern > </ servlet-mapping > < 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 > </ web-app > |
spring基础配置spring.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
<? 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" xmlns:mvc = "http://www.springframework.org/schema/mvc" 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 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> < context:annotation-config /> < mvc:annotation-driven /> < context:component-scan base-package = "controllers" /> <!-- 避免IE执行AJAX时,返回JSON出现下载文件 --> < bean id = "mappingJacksonHttpMessageConverter" class = "org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" > < property name = "supportedMediaTypes" > < list > < value >text/html;charset=utf-8</ value > </ list > </ property > </ bean > <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> < bean class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" > < property name = "messageConverters" > < list > < ref bean = "mappingJacksonHttpMessageConverter" /> <!-- json转换器 --> </ list > </ property > </ bean > <!-- 支持上传文件 --> < bean id = "multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" > <!-- 100M --> < property name = "maxUploadSize" value = "104857600" ></ property > < property name = "defaultEncoding" value = "utf-8" ></ property > </ bean > </ beans > |
二、文件上传的代码
上传的简单页面index.html,要注意form表单提交时的entype的设置:
1
2
3
4
5
6
7
8
9
10
11
12
|
<!DOCTYPE html> < html > < head > < meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" /> </ head > < body > < form action = "./upLoadFile.do" method = "post" enctype = "multipart/form-data" > 选择文件:< input type = "file" name = "file" /> < input type = "submit" value = "提交" /> </ form > </ body > </ html > |
上传对应的后台java代码,具体问题见注释:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
package controllers; import java.io.File; import java.io.IOException; import java.util.Iterator; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.FileUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.commons.CommonsMultipartResolver; @Controller public class fileController { /** * 文件上传 * * @author:tuzongxun * @Title: upLoadFile * @param @param file * @param @param request * @param @throws IllegalStateException * @param @throws IOException * @return void * @date Apr 28, 2016 1:22:00 PM * @throws */ @RequestMapping (value = "/upLoadFile.do" , method = RequestMethod.POST) public void upLoadFile(HttpServletRequest request) throws IllegalStateException, IOException { // @RequestParam("file") MultipartFile file, CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver( request.getSession().getServletContext()); // 判断 request 是否有文件上传,即多部分请求 if (multipartResolver.isMultipart(request)) { // 转换成多部分request MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; // 取得request中的所有文件名 Iterator<String> iter = multiRequest.getFileNames(); while (iter.hasNext()) { // 取得上传文件 MultipartFile f = multiRequest.getFile(iter.next()); if (f != null ) { // 取得当前上传文件的文件名称 String myFileName = f.getOriginalFilename(); // 如果名称不为“”,说明该文件存在,否则说明该文件不存在 if (myFileName.trim() != "" ) { // 定义上传路径 String path = "C:\\Users\\tuzongxun123\\Desktop\\" + myFileName; File localFile = new File(path); f.transferTo(localFile); } } } } } } |
当选择文件提交后,便会看到选中的文件被传到了代码中指定的位置,页面效果图如下
三、文件下载
文件下载需要获取下载文件的存储路径,这里只是手动填入,如果是在具体项目中,可以把文件名和上传后的存储路径保存在数据库中。然后增加一个文件列表的页面展示文件名和文件路径,然后点击下载的时候把相应的文件名和路径传到后台操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/** * 文件下载,需要文件名和文件地址 * * @author:tuzongxun * @Title: download * @param@param name * @param@param path * @param@return * @param@throws IOException * @returnResponseEntity<byte[]> * @date Apr 28,2016 1:21:32 PM * @throws */ @RequestMapping (value = "/downLoadFile.do" ) public ResponseEntity< byte []> download( @RequestParam ( "name" ) String name, @RequestParam ( "filePath" ) String path) throws IOException { File file = new File(path); HttpHeaders headers = new HttpHeaders(); String fileName = new String(name.getBytes( "UTF-8" ), "iso-8859-1" ); // 为了解决中文名称乱码问题 headers.setContentDispositionFormData( "attachment" , fileName); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity< byte []>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); } |
Html页面,这里只是简单的填写文件名和文件路径,用form表单提交到后台,然后后台会控制response在页面弹出保存文件路径的选择框,当然了,这里的后台我没有做什么处理,如果文件不存在是会报错的,可以进行相应的处理:
文件下载:
1
2
3
4
5
6
|
</ br > </ br > < form action = "./downLoadFile.do" style = "border:1px solid grey;width:auto;" method = "post" > 文件名:< input type = "text" name = "name" /></ br ></ br > 文件路径:< input type = "text" name = "filePath" /></ br ></ br > < input type = "submit" value = "确认下载" /> </ form > |
页面视图如下:
如果文件不存在,报错如下:
以上就是本文的全部内容,希望对大家的学习有所帮助。