最近的項目中用到了文件的上傳和下載功能,我覺著這個功能比較重要,因此特意把它提取出來自己進行了嘗試。
下面就是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 > |
頁面視圖如下:
如果文件不存在,報錯如下:
以上就是本文的全部內容,希望對大家的學習有所幫助。