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 返回

 

 

posted @ 2019-07-11 20:50  他也就火三年  阅读(839)  评论(0编辑  收藏  举报