springmvc文件上传到mysql_SpringMVC之文件上传和文件下载

1. 文件上传

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

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

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

文件上传必须条件

表单必须post

表单必须有 file 文件域

表单的 enctype="multipart/form-data"

1.1. 拷贝jar包

16a8646087f7119a71bb1499173d2cb7.png

1.2. 准备jsp页面

1

2 单个文件上传

3

4 姓名:

5 头像:

6 提交

7

8

1.3. 后台代码

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

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

2 @RequestMapping("/upload")3 public String singleUpload(MultipartFile headImg,@RequestParam("username")String username) throwsIOException {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 = newFile(destFile, newFileName);26 //保存文件到本地磁盘

27 headImg.transferTo(file);28

29 return "redirect:/upload.jsp";30 }

1.4. 配置文件上传解析器

1 配置文件上传解析器:bean的名字是固定的2 使用spring表达式 #{1024*1024}3

4

5

6

7

8

1.5. 多文件上传

1

2 单个文件上传

3

4 文件1:

5 文件2:

6 文件3:

7 提交

8

9

1 @RequestMapping("/uploads")2 public String singleUploads(MultipartFile[] headImgs) throwsIOException {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 = newFile(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 packagecn.zj.springmvc.controller;2

3 importjava.io.FileInputStream;4 importjava.io.IOException;5

6 importjavax.servlet.ServletOutputStream;7 importjavax.servlet.http.HttpServletResponse;8

9 importorg.apache.commons.io.IOUtils;10 importorg.springframework.stereotype.Controller;11 importorg.springframework.web.bind.annotation.RequestMapping;12

13 @Controller14 public classDownloadController {15 /*

16 * 下载文件思路17 * 1. 接受需要下载文件名称,根据文件名称,找到磁盘对应的文件,读取到内存中形成一个输入流18 * 2. 将输入流通过响应对象(HttpServletResponse)响应给浏览器(下载)19 *20 * 注意:Web一般只会下载小型文件21 *22 */

23 @RequestMapping("/download")24 public void upload(String fileName ,HttpServletResponse response) throwsIOException {25 //0. 判断是否vip,有积分,金豆26 //TODO27

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 implementsHandlerInterceptor {2 //1):preHandle:控制器方法执行之前执行,返回结果为true表示放行,如果返回为false,表示拦截(可以做权限拦截,登录检查拦截).3 //true : 放行 false :不放行

4 @Override5 public booleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)6 throwsException {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 @Override25 public voidpostHandle(HttpServletRequest request, HttpServletResponse response, Object handler,26 ModelAndView modelAndView) throwsException {27 }28

29 //afterCompletion:视图渲染之后执行(处理Controller异常信息,记录操作日志,清理资源等

30 @Override31 public voidafterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)32 throwsException {33 }34 }

3.1.1. 拦截器的配置的配置

1 <?xml version="1.0" encoding="UTF-8"?>

2

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

14

15

16

17

18

19

20

21

22

23 31 32

33 38 39

40 41 42

43 44 45

46

47

4. 使用poi组件导出excel文件

使用POI组件实现Excel数据的处理.

4.1. 入门案例

4.1.1. 导入jar包

8085da6b72bfdbaf1adca4bb8409a805.png

4.1.2. 案例代码

1 //使用POI创建excel文件到本地

2 @Test3 public void testName() throwsException {4 //1.创建数据,用于本地创建excel

5 HSSFWorkbook book = newHSSFWorkbook();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 voidexport(HttpServletResponse response) {4

5

6 //创建POI的数据对象

7 HSSFWorkbook book = newHSSFWorkbook();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 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返回

1a102b618ba71aa1302fbc5f08f64ebe.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值