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

     

  • 相关阅读:
    c语言数据处理!
    指针的概念
    return的用处
    用java写随机出题
    java 新手
    分支程序设计。
    不同车型 不同起步价不同费用的问题(switch语句)
    这两天做了很多随机函数的用法(下面是一个出题实验)。
    yum 命令讲解
    日常工作中一些常用命令
  • 原文地址:https://www.cnblogs.com/qq2267711589/p/11172657.html
Copyright © 2020-2023  润新知