SapringMVC的文件上传下载以及拦截器
1. 文件上传
一般JavaWeb开发中文件上传使用的 Apache组织的Commons FileUpload组件
SpringMVC中使用 MultipartFile file对象接受上传文件,必须保证 后台参数的名称和表单提交的文件的名称一致
文件上传必须条件
- 表单必须post
- 表单必须有 file 文件域
- 表单的 enctype="multipart/form-data"
jsp页面代码
<fieldset> <legend>单个文件上传</legend> <form action="${pageContext.request.contextPath}/upload.do" method="post" enctype="multipart/form-data"> 姓名: <input name="username"><br> 头像: <input type="file" name="headImg"><br> <button type="submit">提交</button> </form> </fieldset>
后台代码
@RequestMapping("/upload") public String singleUpload(MultipartFile headImg,@RequestParam("username")String username) throws IOException { System.out.println(headImg.getName());//获取上传文件的表单名称 System.out.println(headImg.getContentType());//MIME类型 System.out.println(headImg.getSize());//文件大小 System.out.println(headImg.getOriginalFilename());//获取上传文件的完整名称 //获取上传文件对应的输入流 //InputStream in = headImg.getInputStream(); //创建一个磁盘目录用于保存文件 File destFile= new File("c:/upload"); if(!destFile.exists()) { destFile.mkdir(); } //使用uuid作为文件随机名称 String fileName = UUID.randomUUID().toString().replaceAll("-", ""); //使用FileNameUtils获取上传文件名的后缀 String extension = FilenameUtils.getExtension(headImg.getOriginalFilename());// jpg , png ...... //创建新的文件名称 String newFileName = fileName + "."+extension; //创建要保存文件的File对象 File file = new File(destFile, newFileName); //保存文件到本地磁盘 headImg.transferTo(file); return "redirect:/upload.jsp"; }
文件上传解析器的配置
<!-- 配置文件上传解析器:bean的名字是固定的,底层使用的名称注入 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置上传文件的最大尺寸为1MB --> <property name="maxUploadSize" value="#{1024 * 1024}"></property> </bean>
多文件上传
<fieldset> <legend>多
@RequestMapping("/uploads") public String singleUploads(MultipartFile[] headImgs) throws IOException { //创建一个磁盘目录用于保存文件 File destFile= new File("c:/upload"); if(!destFile.exists()) { destFile.mkdir(); } for (int i = 0; i < headImgs.length; i++) { MultipartFile headImg = headImgs[i]; //使用uuid作为文件随机名称 String fileName = UUID.randomUUID().toString().replaceAll("-", ""); //使用FileNameUtils获取上传文件名的后缀 String extension = FilenameUtils.getExtension(headImg.getOriginalFilename());// jpg , png 等等 //创建新的文件名称 String newFileName = fileName + "."+extension; //创建要保存文件的File对象 File file = new File(destFile, newFileName); //保存文件到本地磁盘 try { headImg.transferTo(file); } catch (Exception e) { e.printStackTrace(); } } return "redirect:/upload.jsp"; }
2. 文件下载
文件下载,SpringMVC并没有做过多的封装,还是使用原来的下载方式
package cn.zj.springmvc.controller; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class DownloadController { /* * 下载文件思路 * 1. 接受需要下载文件名称,根据文件名称,找到磁盘对应的文件,读取到内存中形成一个输入流 * 2. 将输入流通过响应对象(HttpServletResponse)响应给浏览器(下载) * * 注意:Web一般只会下载小型文件 * */ @RequestMapping("/download") public void upload(String fileName ,HttpServletResponse response) throws IOException { //0. 判断是否vip,有积分,金豆 //TODO //1. 接受文件名,读取磁盘对应的文件,创建输入流对象 FileInputStream inputStream = new FileInputStream("C:/"+fileName); //2.获取响应对象的输出流 ServletOutputStream outputStream = response.getOutputStream(); //3.文件下载文件名的编码使用ISO-08859-1编码 //我们需要将我们UTF-8的 filename转换ISO-8859-1编码 //3.1先将字符串以UTF-8转换成字节数组 byte[] bytes = fileName.getBytes("UTF-8"); //3.2再将字节数组以 ISO-8859-1转换字符串 fileName = new String(bytes, "ISO-8859-1"); //4.响应的内容应该是以附件的形式响应给浏览器(设置响应头) response.setHeader("Content-Disposition", "attachment;filename="+fileName); //5.响应文件给浏览器 IOUtils.copy(inputStream, outputStream); } }
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异常信息,记录操作日志,清理资源等)
2.1. 自定义拦截器
public class CheckLoginInterceptor implements HandlerInterceptor { //1):preHandle:控制器方法执行之前执行,返回结果为true表示放行,如果返回为false,表示拦截(可以做权限拦截,登录检查拦截). // true : 放行 false :不放行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("拦截器执行了......"); //从Session中获取登录信息 String username = (String)request.getSession().getAttribute("username"); System.out.println(username); if(username !=null) { //放行 return true; }else { //跳转到登录页面去 response.sendRedirect(request.getContextPath()+"/login.jsp"); return false; } } //postHandle:控制器方法执行后,视图渲染之前执行(可以加入统一的响应信息). @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } //afterCompletion:视图渲染之后执行(处理Controller异常信息,记录操作日志,清理资源等 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
2.1.1. 拦截器的配置的配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <!-- 配置springmvc的注解驱动 --> <mvc:annotation-driven/> <!-- 配置拦截器 :可以有多个拦截器--> <mvc:interceptors> <!--配置检查登录拦截器 --> <mvc:interceptor> <!-- 配置拦截的规则 只会拦截 控制器请求,不会拦截jsp页面 /* 只能拦截一级 如 : /list.do /delete.do 如:/user/list.do , /user/delete.do 二级 不能拦截 /** 可以拦截多级 无论几级都可以 如 /a/b/c/d/list.do --> <mvc:mapping path="/**"/> <!-- 排除拦截的地址,多个地址使用逗号隔开 /user/login.do --> <mvc:exclude-mapping path="/user/login.do"/> <!-- 拦截器的类型 --> <bean class="cn.zj.ssm.interceptor.CheckLoginInterceptor"/> </mvc:interceptor> </mvc:interceptors> </beans>