springmvc笔记-7-文件上传下载,拦截器

来源:互联网 发布:开淘宝网店详细步骤 编辑:程序博客网 时间:2024/06/15 13:58

文件上传:
springmvc上传文件需要依赖:
Apache Commons FileUpload组件jar和commons.io

Apache Commons FileUpload的下载地址:http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
commons.io的下载地址:http://commons.apache.org/proper/commons-io/
案例:
上传文件的表单设置必须 enctype=”multipart/form-data” method=”post”
访问:http://localhost:8080/springmvcNote1/fileupdownload/updown
进入loginForm方法,跳转到upDownloadFile.jsp页面

    @RequestMapping("updown")     public String loginForm(){        // 动态跳转页面        return "fileUpDownload/upDownloadFile";    }

选好上传文件后提交跳转到upload的方法

// 上传文件会自动绑定到MultipartFile中     @RequestMapping(value="/upload",method=RequestMethod.POST)     public String upload(HttpServletRequest request,            @RequestParam("description") String description,            @RequestParam("file") MultipartFile file) throws Exception{        System.out.println(description);        // 如果文件不为空,写入上传路径        if(!file.isEmpty()){            // 上传文件路径            String path = request.getServletContext().getRealPath(                    "/upload/");            System.out.println(path);            // 上传文件名            String filename = file.getOriginalFilename();            File filepath = new File(path,filename);            // 判断路径是否存在,如果不存在就创建一个            if (!filepath.getParentFile().exists()) {                 filepath.getParentFile().mkdirs();            }            // 将上传文件保存到一个目标文件当中            file.transferTo(new File(path+File.separator+ filename));            return "fileUpDownload/success";        }else{            return "fileUpDownload/error";        }     }

对应的xml配置

<bean id="multipartResolver"          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">          <!-- 上传文件大小上限,单位为字节(10MB) -->        <property name="maxUploadSize">              <value>10485760</value>          </property>          <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->        <property name="defaultEncoding">            <value>UTF-8</value>        </property>    </bean>

上传文件案例二:使用对象接受上传文件
访问:http://localhost:8080/springmvcNote1/fileupdownload/personup
进入upform方法跳转到personup.jsp页面

 @RequestMapping("personup")     public String upform(){         return "fileUpDownload/personup";     }

填写上传文件提交,进入register方法

 @RequestMapping(value="/register")     public String register(HttpServletRequest request,             @ModelAttribute UpUser upUser,             Model model)throws Exception{        System.out.println(upUser.getUsername());        // 如果文件不为空,写入上传路径        if(!upUser.getImage().isEmpty()){            // 上传文件路径            String path = request.getServletContext().getRealPath(                    "/personUpload/");            // 上传文件名            String filename = upUser.getImage().getOriginalFilename();            File filepath = new File(path,filename);            // 判断路径是否存在,如果不存在就创建一个            if (!filepath.getParentFile().exists()) {                 filepath.getParentFile().mkdirs();            }            // 将上传文件保存到一个目标文件当中            upUser.getImage().transferTo(new File(path+File.separator+ filename));            // 将用户添加到model            model.addAttribute("upUser", upUser);            return "fileUpDownload/success";        }else{            return "fileUpDownload/error";        }    }

对应的实体

package com.entity;import java.io.Serializable;import org.springframework.web.multipart.MultipartFile;public class UpUser implements Serializable{    private String username;    private MultipartFile image;    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public MultipartFile getImage() {        return image;    }    public void setImage(MultipartFile image) {        this.image = image;    }}

xml配置同上一个案例


下载:只需要各一个链接便可
文件控制器代码

//文件下载     @RequestMapping(value="/download")     public ResponseEntity<byte[]> download(HttpServletRequest request,             @RequestParam("filename") String filename,             Model model)throws Exception{        // 下载文件路径        String path = request.getServletContext().getRealPath(                "/personUpload/");        File file = new File(path+File.separator+ filename);        HttpHeaders headers = new HttpHeaders();          // 下载显示的文件名,解决中文名称乱码问题          String downloadFielName = new String(filename.getBytes("UTF-8"),"iso-8859-1");        // 通知浏览器以attachment(下载方式)打开图片        headers.setContentDispositionFormData("attachment", downloadFielName);         // application/octet-stream : 二进制流数据(最常见的文件下载)。        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);        // 201 HttpStatus.CREATED        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),                    headers, HttpStatus.CREATED);       }

下载页面:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>    <a href="download?filename=文件下载名">asdfasdfasdf</a></body></html>

拦截器:
springmvc拦截器有两种实现方式

//springmvc可以用下面两种方式设置拦截器//implements HandlerInterceptor(org.springframework.web.servlet.HandlerInterceptor)//extends HandlerInterceptorAdapter(org.springframework.web.servlet.handler.HandlerInterceptorAdapter;)

访问:
http://localhost:8080/springmvcNote1/interceptor/loginForm
进入loginform方法,跳转到loginForm.jsp页面

    @RequestMapping("loginForm")    public String loginform(){        return "interceptor/loginForm";    }

输入用户名和密码提交,

    @RequestMapping(value="/login")     public ModelAndView login(             String name,String password,             ModelAndView mv,             HttpSession session){        // 模拟数据库根据登录名和密码查找用户,判断用户登录        if(name != null && name.equals("caoxuekun")                && password!= null && password.equals("123")){            // 模拟创建用户            User user = new User();            user.setName(name);            user.setPassword(password);            // 登录成功,将user对象设置到HttpSession作用范围域            session.setAttribute("user", user);            // 转发到main请求            mv.setViewName("redirect:main");//重定向        }else{            // 登录失败,设置失败提示信息,并跳转到登录页面            mv.addObject("message", "登录名或密码错误,请重新输入!");            mv.setViewName("interceptor/loginForm");        }        return mv;    }

main的重定向

    @RequestMapping("main")    public String main(){        return "interceptor/main";    }

拦截器对应类

package com.core;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import com.entity.User;//springmvc可以用下面两种方式设置拦截器//implements HandlerInterceptor(org.springframework.web.servlet.HandlerInterceptor)//extends HandlerInterceptorAdapter(org.springframework.web.servlet.handler.HandlerInterceptorAdapter;)public class MyInterceptor implements HandlerInterceptor{    // 不拦截"/loginForm"和"/login"请求        private static final String[] IGNORE_URI = {"/loginForm", "/login"};         /**          * 该方法将在整个请求完成之后执行, 主要作用是用于清理资源的,         * 该方法也只能在当前Interceptor的preHandle方法的返回值为true时才会执行。          */          @Override        public void afterCompletion(HttpServletRequest request,                HttpServletResponse response, Object handler, Exception exception)                throws Exception {            System.out.println("AuthorizationInterceptor afterCompletion --> ");        }        /**          * 该方法将在Controller的方法调用之后执行, 方法中可以对ModelAndView进行操作 ,         * 该方法也只能在当前Interceptor的preHandle方法的返回值为true时才会执行。          */        @Override        public void postHandle(HttpServletRequest request, HttpServletResponse response,                Object handler, ModelAndView mv) throws Exception {            System.out.println("AuthorizationInterceptor postHandle --> ");        }         /**          * preHandle方法是进行处理器拦截用的,该方法将在Controller处理之前进行调用,         * 该方法的返回值为true拦截器才会继续往下执行,该方法的返回值为false的时候整个请求就结束了。          */          @Override        public boolean preHandle(HttpServletRequest request, HttpServletResponse response,                Object handler) throws Exception {            System.out.println("AuthorizationInterceptor preHandle --> ");            // flag变量用于判断用户是否登录,默认为false             boolean flag = false;             //获取请求的路径进行判断            String servletPath = request.getServletPath();            // 判断请求是否需要拦截            for (String s : IGNORE_URI) {                if (servletPath.contains(s)) {                    flag = true;                    break;                }            }            // 拦截请求            if (!flag){                // 1.获取session中的用户                 User user = (User) request.getSession().getAttribute("user");                // 2.判断用户是否已经登录                 if(user == null){                    // 如果用户没有登录,则设置提示信息,跳转到登录页面                     System.out.println("AuthorizationInterceptor拦截请求:");                     request.setAttribute("message", "请先登录再访问网站");                     request.getRequestDispatcher("loginForm").forward(request, response);                }else{                    // 如果用户已经登录,则验证通过,放行                     System.out.println("AuthorizationInterceptor放行请求:");                     flag = true;                }            }            return flag;        }}

拦截器的xml配置:

    <!-- 拦截器配置 -->    <mvc:interceptors>        <mvc:interceptor>            <mvc:mapping path="/*"/>            <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->              <bean class="com.core.MyInterceptor"/>        </mvc:interceptor>    </mvc:interceptors>

实体类

package com.entity;import java.io.Serializable;public class User implements Serializable{    private String name;    private String password;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }}
原创粉丝点击