zoukankan      html  css  js  c++  java
  • SapringMVC的文件上传下载以及拦截器

    1.      文件上传

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

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

    文件上传必须条件

    1. 表单必须post
    2. 表单必须有 file 文件域
    3. 表单的 enctype="multipart/form-data"

     jsp页面代码

    <fieldset>
    		<legend>单个文件上传</legend>
    		<form action="${pageContext.request.contextPath}/upload.do" method="post" enctype="multipart/form-data">
    			姓名: <input name="username"><br>
    			头像: <input type="file" name="headImg"><br>
    			<button type="submit">提交</button>
    		</form>
    </fieldset>
    

    后台代码

    	@RequestMapping("/upload")
    	public String singleUpload(MultipartFile headImg,@RequestParam("username")String username) throws IOException {
    		
    		System.out.println(headImg.getName());//获取上传文件的表单名称 
    		System.out.println(headImg.getContentType());//MIME类型
    		System.out.println(headImg.getSize());//文件大小
    		System.out.println(headImg.getOriginalFilename());//获取上传文件的完整名称
    		//获取上传文件对应的输入流
    		//InputStream in = headImg.getInputStream();
    		
    		//创建一个磁盘目录用于保存文件
    		File destFile= new File("c:/upload");
    		if(!destFile.exists()) {
    			destFile.mkdir();
    		}
    		//使用uuid作为文件随机名称
    		String fileName = UUID.randomUUID().toString().replaceAll("-", "");
    		//使用FileNameUtils获取上传文件名的后缀
    		String extension = FilenameUtils.getExtension(headImg.getOriginalFilename());// jpg , png ......
    		//创建新的文件名称
    		String newFileName = fileName + "."+extension;
    		
    		//创建要保存文件的File对象
    		File file = new File(destFile, newFileName);
    		//保存文件到本地磁盘
    		headImg.transferTo(file);
    		
    		return "redirect:/upload.jsp";
    	}
    

      文件上传解析器的配置

    <!-- 配置文件上传解析器:bean的名字是固定的,底层使用的名称注入 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    	<!-- 设置上传文件的最大尺寸为1MB -->
    	<property name="maxUploadSize" value="#{1024 * 1024}"></property>
    </bean>
    

     

    多文件上传

    <fieldset>
    		<legend>多
    @RequestMapping("/uploads")
    	public String singleUploads(MultipartFile[] headImgs) throws IOException {
    		
    
    		//创建一个磁盘目录用于保存文件
    		File destFile= new File("c:/upload");
    		if(!destFile.exists()) {
    			destFile.mkdir();
    		}
    		for (int i = 0; i < headImgs.length; i++) {
    			MultipartFile headImg = headImgs[i];
    			
    			//使用uuid作为文件随机名称
    			String fileName = UUID.randomUUID().toString().replaceAll("-", "");
    			//使用FileNameUtils获取上传文件名的后缀
    			String extension = FilenameUtils.getExtension(headImg.getOriginalFilename());// jpg , png 等等
    			//创建新的文件名称
    			String newFileName = fileName + "."+extension;
    			
    			//创建要保存文件的File对象
    			File file = new File(destFile, newFileName);
    			//保存文件到本地磁盘
    			try {
    				headImg.transferTo(file);
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    		return "redirect:/upload.jsp";
    	}
    
    

      

    2.      文件下载

    文件下载,SpringMVC并没有做过多的封装,还是使用原来的下载方式

    package cn.zj.springmvc.controller;
    
     
    
    import java.io.FileInputStream;
    
    import java.io.IOException;
    
     
    
    import javax.servlet.ServletOutputStream;
    
    import javax.servlet.http.HttpServletResponse;
    
     
    
    import org.apache.commons.io.IOUtils;
    
    import org.springframework.stereotype.Controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    
     
    
    @Controller
    
    public class DownloadController {
    
        /*
    
         * 下载文件思路
    
         * 1. 接受需要下载文件名称,根据文件名称,找到磁盘对应的文件,读取到内存中形成一个输入流
    
         * 2. 将输入流通过响应对象(HttpServletResponse)响应给浏览器(下载)
    
         *
    
         * 注意:Web一般只会下载小型文件
    
         *
    
         */
    
        @RequestMapping("/download")
    
        public void upload(String fileName ,HttpServletResponse response) throws IOException {
    
            //0. 判断是否vip,有积分,金豆
    
            //TODO
    
           
    
            //1. 接受文件名,读取磁盘对应的文件,创建输入流对象
    
           
    
            FileInputStream inputStream = new FileInputStream("C:/"+fileName);
    
           
    
            //2.获取响应对象的输出流
    
            ServletOutputStream outputStream = response.getOutputStream();
    
           
    
           
    
            //3.文件下载文件名的编码使用ISO-08859-1编码
    
            //我们需要将我们UTF-8的 filename转换ISO-8859-1编码
    
            //3.1先将字符串以UTF-8转换成字节数组
    
            byte[] bytes = fileName.getBytes("UTF-8");
    
            //3.2再将字节数组以 ISO-8859-1转换字符串
    
            fileName = new String(bytes, "ISO-8859-1");
    
           
    
           
    
            //4.响应的内容应该是以附件的形式响应给浏览器(设置响应头)
    
            response.setHeader("Content-Disposition", "attachment;filename="+fileName);
    
           
    
            //5.响应文件给浏览器
    
            IOUtils.copy(inputStream, outputStream);
    
           
    
        }
    
       
    
    }
    

      

      

    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异常信息,记录操作日志,清理资源等)

    2.1.  自定义拦截器

    public class CheckLoginInterceptor implements HandlerInterceptor {
    
        //1):preHandle:控制器方法执行之前执行,返回结果为true表示放行,如果返回为false,表示拦截(可以做权限拦截,登录检查拦截).
    
        // true : 放行  false :不放行
    
        @Override
    
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    
                throws Exception {
    
           
    
            System.out.println("拦截器执行了......");
    
            //从Session中获取登录信息
    
            String username = (String)request.getSession().getAttribute("username");
    
            System.out.println(username);
    
           
    
            if(username !=null) {
    
                //放行
    
                return true;
    
            }else {
    
                //跳转到登录页面去
    
                response.sendRedirect(request.getContextPath()+"/login.jsp");
    
                return false;
    
            }
    
        }
    
       
    
        //postHandle:控制器方法执行后,视图渲染之前执行(可以加入统一的响应信息).
    
        @Override
    
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
    
                ModelAndView modelAndView) throws Exception {
    
        }
    
       
    
        //afterCompletion:视图渲染之后执行(处理Controller异常信息,记录操作日志,清理资源等
    
        @Override
    
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    
                throws Exception {
    
        }
    
    }
    

      


    2.1.1.  拦截器的配置的配置
     

    <?xml version="1.0" encoding="UTF-8"?>
    
    <beans xmlns="http://www.springframework.org/schema/beans"
    
        xmlns:p="http://www.springframework.org/schema/p"
    
        xmlns:mvc="http://www.springframework.org/schema/mvc"
    
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
        xsi:schemaLocation="
    
            http://www.springframework.org/schema/beans
    
            http://www.springframework.org/schema/beans/spring-beans.xsd
    
            http://www.springframework.org/schema/mvc
    
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
    
            ">
    
     
    
            <!-- 配置springmvc的注解驱动 -->
    
            <mvc:annotation-driven/>
    
       
    
           
    
           
    
            <!-- 配置拦截器 :可以有多个拦截器-->
    
            <mvc:interceptors>
    
                <!--配置检查登录拦截器  -->
    
                <mvc:interceptor>
    
                   
    
                    <!-- 配置拦截的规则
    
                        只会拦截 控制器请求,不会拦截jsp页面
    
                        /* 
    
                            只能拦截一级 如 : /list.do /delete.do
    
                            如:/user/list.do , /user/delete.do 二级 不能拦截
    
                        /**
    
                            可以拦截多级 无论几级都可以 如  /a/b/c/d/list.do
    
                     -->
    
                    <mvc:mapping path="/**"/>
    
                   
    
                    <!-- 排除拦截的地址,多个地址使用逗号隔开
    
                        /user/login.do
    
                       
    
                       
    
                     -->
    
                    <mvc:exclude-mapping path="/user/login.do"/>
    
               
    
                    <!-- 拦截器的类型 -->
    
                    <bean class="cn.zj.ssm.interceptor.CheckLoginInterceptor"/>
    
               
    
                </mvc:interceptor>
    
            </mvc:interceptors>
    
           
    
           
    
    </beans>
    

      

  • 相关阅读:
    其实你的痛苦 跟别人完全没有关系
    一篇很好的“金刚念诵要诀” 首愚法师开示【精华】 [唇齿不动]的过程及要诀
    无我的智慧十五
    随在你:放心的智慧
    利用念头及情绪
    [转载]无我的智慧 第一章 镜中修行
    看到自己真实本性的人
    肯.威尔伯论觉知
    觉醒之光【六】觉醒
    觉醒之光【十一】关系
  • 原文地址:https://www.cnblogs.com/w312308542/p/11172635.html
Copyright © 2011-2022 走看看