SpringMVC之文件上传和文件下载
1. 文件上传
在web开发中一般会有文件上传的操作
一般JavaWeb开发中文件上传使用的 Apache组织的Commons FileUpload组件
SpringMVC中使用 MultipartFile file对象接受上传文件,必须保证 后台参数的名称和表单提交的文件的名称一致
文件上传必须条件
- 表单必须post
- 表单必须有 file 文件域
表单的 enctype="multipart/form-data"
1.1. 拷贝jar包
1.2. 准备jsp页面
1 <fieldset> 2 <legend>单个文件上传</legend> 3 <form action="${pageContext.request.contextPath}/upload.do" method="post" enctype="multipart/form-data"> 4 姓名: <input name="username"><br> 5 头像: <input type="file" name="headImg"><br> 6 <button type="submit">提交</button> 7 </form> 8 </fieldset>
1.3. 后台代码
SpringMVC中使用 MultipartFile file对象接受上传文件,必须保证 后台方法MultipartFile 参数的名称和表单提交的文件的名称一致
1 //SpringMVC中使用 MultipartFile file对象接受上传文件,必须保证 后台参数的名称和表单提交的文件的名称一致 2 @RequestMapping("/upload") 3 public String singleUpload(MultipartFile headImg,@RequestParam("username")String username) throws IOException { 4 5 System.out.println(headImg.getName());//获取上传文件的表单名称 6 System.out.println(headImg.getContentType());//MIME类型 7 System.out.println(headImg.getSize());//文件大小 8 System.out.println(headImg.getOriginalFilename());//获取上传文件的完整名称 9 //获取上传文件对应的输入流 10 //InputStream in = headImg.getInputStream(); 11 12 //创建一个磁盘目录用于保存文件 13 File destFile= new File("c:/upload"); 14 if(!destFile.exists()) { 15 destFile.mkdir(); 16 } 17 //使用uuid作为文件随机名称 18 String fileName = UUID.randomUUID().toString().replaceAll("-", ""); 19 //使用FileNameUtils获取上传文件名的后缀 20 String extension = FilenameUtils.getExtension(headImg.getOriginalFilename());// jpg , png 等等 21 //创建新的文件名称 22 String newFileName = fileName + "."+extension; 23 24 //创建要保存文件的File对象 25 File file = new File(destFile, newFileName); 26 //保存文件到本地磁盘 27 headImg.transferTo(file); 28 29 return "redirect:/upload.jsp"; 30 }
1.4. 配置文件上传解析器
1 配置文件上传解析器:bean的名字是固定的 2 使用spring表达式 #{1024*1024} 3 4 <!-- 配置文件上传解析器:bean的名字是固定的,底层使用的名称注入 --> 5 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 6 <!-- 设置上传文件的最大尺寸为1MB --> 7 <property name="maxUploadSize" value="#{1024 * 1024}"></property> 8 </bean>
1.5. 多文件上传
1 <fieldset> 2 <legend>单个文件上传</legend> 3 <form action="${pageContext.request.contextPath}/uploads.do" method="post" enctype="multipart/form-data"> 4 文件1: <input type="file" name="headImgs"><br> 5 文件2: <input type="file" name="headImgs"><br> 6 文件3: <input type="file" name="headImgs"><br> 7 <button type="submit">提交</button> 8 </form> 9 </fieldset>
1 @RequestMapping("/uploads") 2 public String singleUploads(MultipartFile[] headImgs) throws IOException { 3 4 5 //创建一个磁盘目录用于保存文件 6 File destFile= new File("c:/upload"); 7 if(!destFile.exists()) { 8 destFile.mkdir(); 9 } 10 for (int i = 0; i < headImgs.length; i++) { 11 MultipartFile headImg = headImgs[i]; 12 13 //使用uuid作为文件随机名称 14 String fileName = UUID.randomUUID().toString().replaceAll("-", ""); 15 //使用FileNameUtils获取上传文件名的后缀 16 String extension = FilenameUtils.getExtension(headImg.getOriginalFilename());// jpg , png 等等 17 //创建新的文件名称 18 String newFileName = fileName + "."+extension; 19 20 //创建要保存文件的File对象 21 File file = new File(destFile, newFileName); 22 //保存文件到本地磁盘 23 try { 24 headImg.transferTo(file); 25 } catch (Exception e) { 26 e.printStackTrace(); 27 } 28 } 29 return "redirect:/upload.jsp"; 30 }
2. 文件下载
文件下载,SpringMVC并没有做过多的封装,还是使用原来的下载方式
1 package cn.zj.springmvc.controller; 2 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 6 import javax.servlet.ServletOutputStream; 7 import javax.servlet.http.HttpServletResponse; 8 9 import org.apache.commons.io.IOUtils; 10 import org.springframework.stereotype.Controller; 11 import org.springframework.web.bind.annotation.RequestMapping; 12 13 @Controller 14 public class DownloadController { 15 /* 16 * 下载文件思路 17 * 1. 接受需要下载文件名称,根据文件名称,找到磁盘对应的文件,读取到内存中形成一个输入流 18 * 2. 将输入流通过响应对象(HttpServletResponse)响应给浏览器(下载) 19 * 20 * 注意:Web一般只会下载小型文件 21 * 22 */ 23 @RequestMapping("/download") 24 public void upload(String fileName ,HttpServletResponse response) throws IOException { 25 //0. 判断是否vip,有积分,金豆 26 //TODO 27 28 //1. 接受文件名,读取磁盘对应的文件,创建输入流对象 29 30 FileInputStream inputStream = new FileInputStream("C:/"+fileName); 31 32 //2.获取响应对象的输出流 33 ServletOutputStream outputStream = response.getOutputStream(); 34 35 36 //3.文件下载文件名的编码使用ISO-08859-1编码 37 //我们需要将我们UTF-8的 filename转换ISO-8859-1编码 38 //3.1先将字符串以UTF-8转换成字节数组 39 byte[] bytes = fileName.getBytes("UTF-8"); 40 //3.2再将字节数组以 ISO-8859-1转换字符串 41 fileName = new String(bytes, "ISO-8859-1"); 42 43 44 //4.响应的内容应该是以附件的形式响应给浏览器(设置响应头) 45 response.setHeader("Content-Disposition", "attachment;filename="+fileName); 46 47 //5.响应文件给浏览器 48 IOUtils.copy(inputStream, outputStream); 49 50 } 51 52 }
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异常信息,记录操作日志,清理资源等)
3.1. 自定义拦截器
1 public class CheckLoginInterceptor implements HandlerInterceptor { 2 //1):preHandle:控制器方法执行之前执行,返回结果为true表示放行,如果返回为false,表示拦截(可以做权限拦截,登录检查拦截). 3 // true : 放行 false :不放行 4 @Override 5 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 6 throws Exception { 7 8 System.out.println("拦截器执行了......"); 9 //从Session中获取登录信息 10 String username = (String)request.getSession().getAttribute("username"); 11 System.out.println(username); 12 13 if(username !=null) { 14 //放行 15 return true; 16 }else { 17 //跳转到登录页面去 18 response.sendRedirect(request.getContextPath()+"/login.jsp"); 19 return false; 20 } 21 } 22 23 //postHandle:控制器方法执行后,视图渲染之前执行(可以加入统一的响应信息). 24 @Override 25 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 26 ModelAndView modelAndView) throws Exception { 27 } 28 29 //afterCompletion:视图渲染之后执行(处理Controller异常信息,记录操作日志,清理资源等 30 @Override 31 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 32 throws Exception { 33 } 34 }
3.1.1. 拦截器的配置的配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:mvc="http://www.springframework.org/schema/mvc" 5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 6 xsi:schemaLocation=" 7 http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/mvc 10 http://www.springframework.org/schema/mvc/spring-mvc.xsd 11 "> 12 13 <!-- 配置springmvc的注解驱动 --> 14 <mvc:annotation-driven/> 15 16 17 18 <!-- 配置拦截器 :可以有多个拦截器--> 19 <mvc:interceptors> 20 <!--配置检查登录拦截器 --> 21 <mvc:interceptor> 22 23 <!-- 配置拦截的规则 24 只会拦截 控制器请求,不会拦截jsp页面 25 /* 26 只能拦截一级 如 : /list.do /delete.do 27 如:/user/list.do , /user/delete.do 二级 不能拦截 28 /** 29 可以拦截多级 无论几级都可以 如 /a/b/c/d/list.do 30 --> 31 <mvc:mapping path="/**"/> 32 33 <!-- 排除拦截的地址,多个地址使用逗号隔开 34 /user/login.do 35 36 37 --> 38 <mvc:exclude-mapping path="/user/login.do"/> 39 40 <!-- 拦截器的类型 --> 41 <bean class="cn.zj.ssm.interceptor.CheckLoginInterceptor"/> 42 43 </mvc:interceptor> 44 </mvc:interceptors> 45 46 47 </beans>
4. 使用poi组件导出excel文件
使用POI组件实现Excel数据的处理.
4.1. 入门案例
4.1.1. 导入jar包
4.1.2. 案例代码
1 //使用POI创建excel文件到本地 2 @Test 3 public void testName() throws Exception { 4 //1.创建数据,用于本地创建excel 5 HSSFWorkbook book = new HSSFWorkbook(); 6 //2.创建一个sheet 工作区域 7 HSSFSheet sheet = book.createSheet(); 8 //3.创建一行: 从0开始,代表第一行 9 HSSFRow row = sheet.createRow(0); 10 //4.创建一个个单元格 11 HSSFCell cell1 = row.createCell(0); 12 //5.设置单元格的数据 13 cell1.setCellValue("张三"); 14 15 HSSFCell cell2 = row.createCell(1); 16 cell2.setCellValue(20); 17 18 //将数据保存到本地 19 try { 20 book.write(new File("d:/测试.xlsx")); 21 } catch (Exception e) { 22 e.printStackTrace(); 23 // TODO: handle exception 24 } 25 }
4.2. 使用POI导出数据库的所有用户信息
1 // 导出用户信息 2 @RequestMapping("/exprot") 3 public void export(HttpServletResponse response) { 4 5 6 //创建POI的数据对象 7 HSSFWorkbook book = new HSSFWorkbook(); 8 //创建sheet 9 HSSFSheet sheet = book.createSheet(); 10 //创建标题列 11 HSSFRow titleRow = sheet.createRow(0); 12 //创建表单单元格并设置值 13 titleRow.createCell(0).setCellValue("编号"); 14 titleRow.createCell(1).setCellValue("姓名"); 15 titleRow.createCell(2).setCellValue("邮箱"); 16 titleRow.createCell(3).setCellValue("电话"); 17 18 List<User> users = service.list(); 19 //循环学生 20 for (int i = 0; i < users.size(); i++) { 21 //获取每个学生 22 User user = users.get(i); 23 //创建学生列 24 HSSFRow row = sheet.createRow(i+1); 25 //创建学生信息对应的单元格并设置数据 26 row.createCell(0).setCellValue(user.getId()); 27 row.createCell(1).setCellValue(user.getName()); 28 row.createCell(2).setCellValue(user.getEmail()); 29 row.createCell(3).setCellValue(user.getPhone()); 30 } 31 32 try { 33 //设置响应头,响应的内容是为附件形式 34 response.addHeader("Content-Disposition", 35 "attachment;filename=" + new String("学生信息.xlsx".getBytes(), "ISO-8859-1")); 36 37 book.write(response.getOutputStream()); 38 } catch (Exception e) { 39 e.printStackTrace(); 40 } 41 }
5. SpringMVC 控制器 Controller的生命周期
Spring 容器创建的对象默认 都是单例 对象
SpringMVC对象 Controller的对象的创建有三种情况
Request : 在用户的一次请求中生效(用户每次请求都会创建Controller对象)多例
Session : Controller对象在一次会话中创建一个对象
如果控制器中有成员变量 设置或者赋值操作,必须使用 request 返回