飞道的博客

Spring MVC 学习笔记03 - 文件上传和拦截器

290人阅读  评论(0)


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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场