2020/4/15
springmvc完结篇,mybatis,spring,springmvc,三大件基本完结,ssm整合即将到来!
人智统合真国,也就是fgo2.3章的地图bgm
满满的中国风,感受到了大秦的辽阔边疆。越来越想入大秦籍了。
大秦有仙丹,不会生病。
文件上传和下载
上传文件
流程
- 引入jar包依赖
- 编写前段页面
- 编写后端接收页面
- 注册文件上传解析器
- 启动服务器测试
单个文件
引入jar包依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
编写前段页面
<form action="springMvc/upload" method="post" enctype="multipart/form-data">
<input type="file" name="imgs"><br/>
<input type="submit" value="上传">
</form>
form标签上必须添加enctype="multipart/form-data"属性的值,表明要上传文件
编写控制器接收
@RequestMapping("/upload")
public String upload (MultipartFile img) {
String path = "D:/";
String fileName = img.getOriginalFilename();
File file = new File(path, fileName);
try {
img.transferTo(file);
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}
接收的参数为MultipartFile类型
需要创建一个file对象并设置路径和文件名称
通过MultipartFile的getOriginalFilename方法可一获取到传入的文件名
MultipartFile的transferTo方法传入file对象即可
springmvc注册文件上传扫描器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
</bean>
这里的id名和class名是固定的,不可以改变
property注入defaultEncoding可以设置编码格式
多个文件
与单个文件差异不打,jar包和xml文件配置都是一样的
前段页面
<form action="springMvc/upload" method="post" enctype="multipart/form-data">
<input type="file" name="imgs"><br/>
<input type="file" name="imgs"><br/>
<input type="file" name="imgs"><br/>
<input type="submit" value="上传">
</form>
控制器代码
@RequestMapping("/upload")
public String upload (
@RequestParam MultipartFile[] imgs,
HttpSession session
) {
String path = session.getServletContext().getRealPath("/");
for (MultipartFile img : imgs) {
String fileName = img.getOriginalFilename();
File file = new File(path, fileName);
try {
img.transferTo(file);
} catch (IOException e) {
e.printStackTrace();
}
}
return "success";
}
这里代码是用了session对象拿到了sercletContext用sercletContext获取了项目的根目录,然后把上传的文件放在了根目录上
传入的参数是MultipartFile类型的数组,传入数组需要使用@RequestParam注解矫正
然后用for循环遍历之后使用transferTo方法即可
下载文件
控制器代码
@RequestMapping("/download")
public ResponseEntity<byte[]> downLoad () throws Exception {
// 指定下载文件
File file = new File("d:/锐雯.jpg");
InputStream is = new FileInputStream(file);
// 创建字节数组,并且设置数组大小位预估的文件字节数
byte[] body = new byte[is.available()];
// 将输入流字符存储到缓存数组中
is.read(body);
// 获取下载显示的文件名,中文乱码问题
String name = file.getName();
String s = new String(name.getBytes("utf-8"), "ISO-8859-1");
// 设置http响应头信息,通知浏览器以附件形式下载
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Content-Disposition", "attachment;filename=" + s);
// 设置http响应状态信息
HttpStatus ok = HttpStatus.OK;
ResponseEntity<byte[]> entity = new ResponseEntity<>(body, httpHeaders, ok);
return entity;
}
自定义拦截器
流程
- 创建拦截器类实现HandlerInterceptor接口
- 重写preHandle,postHandle,afterCompletion方法
- springmvc.xml配置拦截器
拦截器代码
public class FirstInterceptors implements HandlerInterceptor {
// 处理器方法执行之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("preHandle:我给你拦截了!");
return true;
}
// 处理器方法执行之后
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("之后");
}
// 所有工作处理完成之后
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("所有工作结束");
}
}
preHandle
在处理器方法执行前执行
返回一个boolean用于决定处理器方法是否执行
postHandle
处理器方法执行之后执行
afterCompletion
所有工作处理完成之后执行
配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/springMvc/a"/>
<mvc:exclude-mapping path="springMvc/a"/>
<bean id="firstInterceptors" class="top.byfree.interceptors.FirstInterceptors"/>
</mvc:interceptor>
</mvc:interceptors>
mvc:interceptors下可以配置多个mvc:interceptor拦截器,执行顺序为先配置的先执行
mvc:mapping path="/springMvc/a",决定拦截的路径,全部拦截位/**
mvc:exclude-mapping path="springMvc/a"用于配置不拦截的路径,可以取消掉mvc:mapping拦截的路径
封面画师:纯白可怜
Q.E.D.