zoukankan      html  css  js  c++  java
  • SpringMVC之文件上传和文件下载

    1. 文件上传

    web开发中一般会有文件上传的操作

    一般JavaWeb开发中文件上传使用的 Apache组织的Commons FileUpload组件

    SpringMVC中使用  MultipartFile file对象接受上传文件,必须保证 后台参数的名称和表单提交的文件的名称一致

    文件上传必须条件

    1. 表单必须post
    2. 表单必须有 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数据的处理.

    下载路径:http://poi.apache.org/

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

  • 相关阅读:
    [GIT] warning: LF will be replaced by CRLF问题解决方法
    最近想学的工具
    如何在webstrom中配置eslint和less
    Git常用命令
    windows下nginx安装、配置与使用
    关于 addEventListener 和 handleEvent 方法
    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr
    Git使用详细教程
    9个永恒的UI设计原则
    常见浏览器兼容性问题与解决方案
  • 原文地址:https://www.cnblogs.com/qq308015824/p/11172719.html
Copyright © 2011-2022 走看看