Spring MVC 对 Apache fileupload 这个组件进行了封装,由 MultipartFile 接口来实现文件上传,让我们使用起来更加方便,但是底层还是由Apache fileupload 来实现的。
实现文件上传
实现文件上传需要导入相关 jar 包:commons-fileupload;commons-iocommons-io
Maven 项目 commons-iocommons-io 可以不用自己导入,它会自动导入对应版本的 jar 依赖
导入依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
配置文件上传解析器
<!-- 配置文件上传解析器,id 必须是 multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置允许文件上传的大小,单位为字节 -->
<property name="maxUploadSize" value="10485760"></property>
<!-- 上传文件的编码格式 -->
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
前端 jsp 页面
form 表单 的 method 需要设为 post,enctype 设置为 multipart/form-data,以二进制的形式传输数据。
<form action="user/testFileUpload" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"><br>
<input type="submit" value="上传">
</form>
后端 Controller 接收
使用 MultipartFile
对象作为参数,接收前端发送过来的文件,将文件写入本地文件中
@Controller
@RequestMapping(value = "/user")
public class UserController {
@RequestMapping(value = "/testFileUpload")
public String testFileUpload(HttpServletRequest request, MultipartFile upload) throws Exception {
//获取文件存储路径(绝对路径)
String path = request.getSession().getServletContext().getRealPath("/statics/upload/");
File file = new File(path);
//如果文件目录不存在,创建目录
if (!file.exists()) {
file.mkdirs();
}
//获取上传的文件名
String filename = upload.getOriginalFilename();
//完成文件上传
upload.transferTo(new File(path,filename));
return "success";
}
}
拦截器
拦截器的作用
Spring MVC 的处理器拦截器主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆, 用户可以自己定义一些拦截器来实现特定的功能。
拦截器类似于 Servlet 开发中的过滤器 ,但还是有一定的区别:
- 过滤器在任何 java web 工程都可以使用,过滤器在 url-pattern 中配置了 /* 之后,可以对所有要访问的资源拦截。
- 拦截器是 SpringMVC 框架特有的,只有使用了 SpringMVC 框架的工程才能用,拦截器只会拦截访问的控制器方法,如果访问的是 jsp,html, css, image 等是不会进行拦截的。
自定义拦截器
定义一个实现 HandlerInterceptor 接口 的类
public class Interceptor implements HandlerInterceptor {
/**
* 在处理方法之前执行,一般用来做一些准备工作:比如权限检查
* 如果返回 false 表示被拦截,将不会执行处理方法
* 返回 true 继续执行处理方法
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle 方法执行了");
response.sendRedirect(request.getContextPath()+"/index.jsp");
return false;
}
/**
* 在处理方法执行之后,在渲染视图执行之前执行,一般用来做一些清理工作
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle 方法执行了");
}
/**
* 在视图渲染后执行 一般用来释放资源
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion 方法执行了");
}
}
在 springmvc.xml
配置文件中配置拦截器
<mvc:interceptors>
<!-- 配置拦截器 -->
<mvc:interceptor>
<!-- 指定哪些url被拦截 -->
<mvc:mapping path="/user/*"/>
<!-- 自定义拦截器的路径 -->
<bean class="com.hn.interceptor.Interceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
转载:https://blog.csdn.net/O____OZzz/article/details/105935925
查看评论