springmvc的文件上傳和下載,框架集成


1. 文件上傳

web開發中一般會有文件上傳的操作

一般JavaWeb開發中文件上傳使用的 Apache組織的Commons FileUpload組件

SpringMVC中使用  MultipartFile file對象接受上傳文件,必須保證 后台參數的名稱和表單提交的文件的名稱一致

 

文件上傳必須條件

  1. 表單必須post
  2. 表單必須有 file 文件域
  3. 表單的 enctype="multipart/form-data"

 

1)拷貝jar

 

 

2) 准備jsp頁面

 

 1 <fieldset>
 2 
 3 <legend>單個文件上傳</legend>
 4 
 5 <form action="${pageContext.request.contextPath}/upload.do" method="post" enctype="multipart/form-data">
 6 
 7 姓名: <input name="username"><br>
 8 
 9 頭像: <input type="file" name="headImg"><br>
10 
11 <button type="submit">提交</button>
12 
13 </form>
14 
15 </fieldset>

 

 

 

3) 后台代碼

SpringMVC中使用  MultipartFile file對象接受上傳文件,必須保證 后台方法MultipartFile 參數的名稱和表單提交的文件的名稱一致

 1 //SpringMVC中使用  MultipartFile file對象接受上傳文件,必須保證 后台參數的名稱和表單提交的文件的名稱一致
 2 
 3 @RequestMapping("/upload")
 4 
 5 public String singleUpload(MultipartFile headImg,@RequestParam("username")String username) throws IOException {
 6 
 7  
 8 
 9 System.out.println(headImg.getName());//獲取上傳文件的表單名稱
10 
11 System.out.println(headImg.getContentType());//MIME類型
12 
13 System.out.println(headImg.getSize());//文件大小
14 
15 System.out.println(headImg.getOriginalFilename());//獲取上傳文件的完整名稱
16 
17 //獲取上傳文件對應的輸入流
18 
19 //InputStream in = headImg.getInputStream();
20 
21  
22 
23 //創建一個磁盤目錄用於保存文件
24 
25 File destFile= new File("c:/upload");
26 
27 if(!destFile.exists()) {
28 
29 destFile.mkdir();
30 
31 }
32 
33 //使用uuid作為文件隨機名稱
34 
35 String fileName = UUID.randomUUID().toString().replaceAll("-", "");
36 
37 //使用FileNameUtils獲取上傳文件名的后綴
38 
39 String extension = FilenameUtils.getExtension(headImg.getOriginalFilename());// jpg , png 等等
40 
41 //創建新的文件名稱
42 
43 String newFileName = fileName + "."+extension;
44 
45  
46 
47 //創建要保存文件的File對象
48 
49 File file = new File(destFile, newFileName);
50 
51 //保存文件到本地磁盤
52 
53 headImg.transferTo(file);
54 
55  
56 
57 return "redirect:/upload.jsp";
58 
59 }

 

4)配置文件上傳解析器

 

 1 配置文件上傳解析器:bean的名字是固定的
 2 
 3 使用spring表達式 #{1024*1024}
 4 
 5  
 6 
 7 <!-- 配置文件上傳解析器:bean的名字是固定的,底層使用的名稱注入 -->
 8 
 9 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
10 
11 <!-- 設置上傳文件的最大尺寸為1MB -->
12 
13 <property name="maxUploadSize" value="#{1024 * 1024}"></property>
14 
15 </bean>

 

 

 

5) 多文件上傳

 

 1 <fieldset>
 2 
 3 <legend>單個文件上傳</legend>
 4 
 5 <form action="${pageContext.request.contextPath}/uploads.do" method="post" enctype="multipart/form-data">
 6 
 7 文件1: <input type="file" name="headImgs"><br>
 8 
 9 文件2: <input type="file" name="headImgs"><br>
10 
11 文件3: <input type="file" name="headImgs"><br>
12 
13 <button type="submit">提交</button>
14 
15 </form>
16 
17 </fieldset>

 

 1 @RequestMapping("/uploads")
 2 
 3 public String singleUploads(MultipartFile[] headImgs) throws IOException {
 4 
 5  
 6 
 7  
 8 
 9 //創建一個磁盤目錄用於保存文件
10 
11 File destFile= new File("c:/upload");
12 
13 if(!destFile.exists()) {
14 
15 destFile.mkdir();
16 
17 }
18 
19 for (int i = 0; i < headImgs.length; i++) {
20 
21 MultipartFile headImg = headImgs[i];
22 
23  
24 
25 //使用uuid作為文件隨機名稱
26 
27 String fileName = UUID.randomUUID().toString().replaceAll("-", "");
28 
29 //使用FileNameUtils獲取上傳文件名的后綴
30 
31 String extension = FilenameUtils.getExtension(headImg.getOriginalFilename());// jpg , png 等等
32 
33 //創建新的文件名稱
34 
35 String newFileName = fileName + "."+extension;
36 
37  
38 
39 //創建要保存文件的File對象
40 
41 File file = new File(destFile, newFileName);
42 
43 //保存文件到本地磁盤
44 
45 try {
46 
47 headImg.transferTo(file);
48 
49 } catch (Exception e) {
50 
51 e.printStackTrace();
52 
53 }
54 
55 }
56 
57 return "redirect:/upload.jsp";
58 
59 }

 

 

2. 文件下載

文件下載,SpringMVC並沒有做過多的封裝,還是使用原來的下載方式

  1 package cn.zj.springmvc.controller;
  2 
  3  
  4 
  5 import java.io.FileInputStream;
  6 
  7 import java.io.IOException;
  8 
  9  
 10 
 11 import javax.servlet.ServletOutputStream;
 12 
 13 import javax.servlet.http.HttpServletResponse;
 14 
 15  
 16 
 17 import org.apache.commons.io.IOUtils;
 18 
 19 import org.springframework.stereotype.Controller;
 20 
 21 import org.springframework.web.bind.annotation.RequestMapping;
 22 
 23  
 24 
 25 @Controller
 26 
 27 public class DownloadController {
 28 
 29 /*
 30 
 31  * 下載文件思路
 32 
 33  * 1. 接受需要下載文件名稱,根據文件名稱,找到磁盤對應的文件,讀取到內存中形成一個輸入流
 34 
 35  * 2. 將輸入流通過響應對象(HttpServletResponse)響應給瀏覽器(下載)
 36 
 37  *
 38 
 39  * 注意:Web一般只會下載小型文件
 40 
 41  *
 42 
 43  */
 44 
 45 @RequestMapping("/download")
 46 
 47 public void upload(String fileName ,HttpServletResponse response) throws IOException {
 48 
 49 //0. 判斷是否vip,有積分,金豆
 50 
 51 //TODO
 52 
 53  
 54 
 55 //1. 接受文件名,讀取磁盤對應的文件,創建輸入流對象
 56 
 57  
 58 
 59 FileInputStream inputStream = new FileInputStream("C:/"+fileName);
 60 
 61  
 62 
 63 //2.獲取響應對象的輸出流
 64 
 65 ServletOutputStream outputStream = response.getOutputStream();
 66 
 67  
 68 
 69  
 70 
 71 //3.文件下載文件名的編碼使用ISO-08859-1編碼
 72 
 73 //我們需要將我們UTF-8的 filename轉換ISO-8859-1編碼
 74 
 75 //3.1先將字符串以UTF-8轉換成字節數組
 76 
 77 byte[] bytes = fileName.getBytes("UTF-8");
 78 
 79 //3.2再將字節數組以 ISO-8859-1轉換字符串
 80 
 81 fileName = new String(bytes, "ISO-8859-1");
 82 
 83  
 84 
 85  
 86 
 87 //4.響應的內容應該是以附件的形式響應給瀏覽器(設置響應頭)
 88 
 89 response.setHeader("Content-Disposition", "attachment;filename="+fileName);
 90 
 91  
 92 
 93 //5.響應文件給瀏覽器
 94 
 95 IOUtils.copy(inputStream, outputStream);
 96 
 97  
 98 
 99 }
100 
101  
102 
103 }

 

 

 

3. SpringMVC的攔截器

攔截器  Interceptor

Spring MVC 的攔截器類似於Servlet 開發中的過濾器Filter,用於對Controller進行預處理和后處理。

使用SpringMVC攔截器步驟:

1)定義攔截器類,實現接口 org.springframework.web.servlet.HandlerInterceptor

2)applicationContext.xml中配置攔截器

 

攔截器方法的執行時機:

1):preHandle:控制器方法執行之前執行,返回結果為true表示放行,如果返回為false,表示攔截(可以做權限攔截,登錄檢查攔截).

2):postHandle:控制器方法執行后,視圖渲染之前執行(可以加入統一的響應信息).

3):afterCompletion:視圖渲染之后執行(處理Controller異常信息,記錄操作日志,清理資源等)

 

1) 自定義攔截器

 1 public class CheckLoginInterceptor implements HandlerInterceptor {
 2 
 3 //1):preHandle:控制器方法執行之前執行,返回結果為true表示放行,如果返回為false,表示攔截(可以做權限攔截,登錄檢查攔截).
 4 
 5 // true : 放行  false :不放行
 6 
 7 @Override
 8 
 9 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
10 
11 throws Exception {
12 
13  
14 
15 System.out.println("攔截器執行了......");
16 
17 //從Session中獲取登錄信息
18 
19 String username = (String)request.getSession().getAttribute("username");
20 
21 System.out.println(username);
22 
23  
24 
25 if(username !=null) {
26 
27 //放行
28 
29 return true;
30 
31 }else {
32 
33 //跳轉到登錄頁面去
34 
35 response.sendRedirect(request.getContextPath()+"/login.jsp");
36 
37 return false;
38 
39 }
40 
41 }
42 
43  
44 
45 //postHandle:控制器方法執行后,視圖渲染之前執行(可以加入統一的響應信息).
46 
47 @Override
48 
49 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
50 
51 ModelAndView modelAndView) throws Exception {
52 
53 }
54 
55  
56 
57 //afterCompletion:視圖渲染之后執行(處理Controller異常信息,記錄操作日志,清理資源等
58 
59 @Override
60 
61 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
62 
63 throws Exception {
64 
65 }
66 
67 }

 

 

2)攔截器的配置的配置

 

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <beans xmlns="http://www.springframework.org/schema/beans"
 4 
 5 xmlns:p="http://www.springframework.org/schema/p"
 6 
 7 xmlns:mvc="http://www.springframework.org/schema/mvc"
 8 
 9 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10 
11 xsi:schemaLocation="
12 
13 http://www.springframework.org/schema/beans
14 
15         http://www.springframework.org/schema/beans/spring-beans.xsd
16 
17         http://www.springframework.org/schema/mvc
18 
19         http://www.springframework.org/schema/mvc/spring-mvc.xsd
20 
21         ">
22 
23  
24 
25 <!-- 配置springmvc的注解驅動 -->
26 
27 <mvc:annotation-driven/>
28 
29  
30 
31  
32 
33  
34 
35 <!-- 配置攔截器 :可以有多個攔截器-->
36 
37 <mvc:interceptors>
38 
39 <!--配置檢查登錄攔截器  -->
40 
41 <mvc:interceptor>
42 
43  
44 
45 <!-- 配置攔截的規則
46 
47     只會攔截 控制器請求,不會攔截jsp頁面
48 
49 /*  
50 
51 只能攔截一級 如 : /list.do /delete.do
52 
53 如:/user/list.do , /user/delete.do 二級 不能攔截
54 
55 /**
56 
57 可以攔截多級 無論幾級都可以 如  /a/b/c/d/list.do
58 
59  -->
60 
61 <mvc:mapping path="/**"/>
62 
63  
64 
65 <!-- 排除攔截的地址,多個地址使用逗號隔開
66 
67 /user/login.do
68 
69  
70 
71  
72 
73  -->
74 
75 <mvc:exclude-mapping path="/user/login.do"/>
76 
77  
78 
79 <!-- 攔截器的類型 -->
80 
81 <bean class="cn.zj.ssm.interceptor.CheckLoginInterceptor"/>
82 
83  
84 
85 </mvc:interceptor>
86 
87 </mvc:interceptors>
88 
89  
90 
91  
92 
93 </beans>

 

 

 

4. 使用poi組件導出excel文件

使用POI組件實現Excel數據的處理.

下載路徑:http://poi.apache.org/

 

1)入門案例

[1] 導入jar

 

[2] 案例代碼

 1 //使用POI創建excel文件到本地
 2 
 3 @Test
 4 
 5 public void testName() throws Exception {
 6 
 7 //1.創建數據,用於本地創建excel
 8 
 9 HSSFWorkbook book = new HSSFWorkbook();
10 
11 //2.創建一個sheet 工作區域
12 
13 HSSFSheet sheet = book.createSheet();
14 
15 //3.創建一行: 從0開始,代表第一行
16 
17 HSSFRow row = sheet.createRow(0);
18 
19 //4.創建一個個單元格
20 
21 HSSFCell cell1 = row.createCell(0); 
22 
23 //5.設置單元格的數據
24 
25 cell1.setCellValue("張三");
26 
27  
28 
29 HSSFCell cell2 = row.createCell(1);
30 
31 cell2.setCellValue(20);
32 
33  
34 
35 //將數據保存到本地
36 
37 try {
38 
39 book.write(new File("d:/測試.xlsx"));
40 
41 } catch (Exception e) {
42 
43 e.printStackTrace();
44 
45 // TODO: handle exception
46 
47 }
48 
49 }

 

 

2) 使用POI導出數據庫的所有用戶信息

 1 // 導出用戶信息
 2 
 3 @RequestMapping("/exprot")
 4 
 5 public void export(HttpServletResponse response) {
 6 
 7  
 8 
 9  
10 
11 //創建POI的數據對象
12 
13 HSSFWorkbook book = new HSSFWorkbook();
14 
15 //創建sheet
16 
17 HSSFSheet sheet = book.createSheet();
18 
19 //創建標題列
20 
21 HSSFRow titleRow = sheet.createRow(0);
22 
23 //創建表單單元格並設置值
24 
25 titleRow.createCell(0).setCellValue("編號");
26 
27 titleRow.createCell(1).setCellValue("姓名");
28 
29 titleRow.createCell(2).setCellValue("郵箱");
30 
31 titleRow.createCell(3).setCellValue("電話");
32 
33  
34 
35 List<User> users = service.list();
36 
37 //循環學生
38 
39 for (int i = 0; i < users.size(); i++) {
40 
41 //獲取每個學生
42 
43 User user = users.get(i);
44 
45 //創建學生列
46 
47 HSSFRow row = sheet.createRow(i+1);
48 
49 //創建學生信息對應的單元格並設置數據
50 
51 row.createCell(0).setCellValue(user.getId());
52 
53 row.createCell(1).setCellValue(user.getName());
54 
55 row.createCell(2).setCellValue(user.getEmail());
56 
57 row.createCell(3).setCellValue(user.getPhone());
58 
59 }
60 
61  
62 
63 try {
64 
65 //設置響應頭,響應的內容是為附件形式
66 
67 response.addHeader("Content-Disposition",
68 
69 "attachment;filename=" + new String("學生信息.xlsx".getBytes(), "ISO-8859-1"));
70 
71  
72 
73 book.write(response.getOutputStream());
74 
75 } catch (Exception e) {
76 
77 e.printStackTrace();
78 
79 }
80 
81 }

 

 

5. SpringMVC 控制器 Controller的生命周期

Spring 容器創建的對象默認 都是單例 對象

 

SpringMVC對象 Controller的對象的創建有三種情況

 

Request : 在用戶的一次請求中生效(用戶每次請求都會創建Controller對象)多例

Session : Controller對象在一次會話中創建一個對象

 

如果控制器中有成員變量 設置或者賦值操作,必須使用 request 返回

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM