zoukankan      html  css  js  c++  java
  • SpringMVC第二天

    1.文件上传

    在web开发中一般会有文件上传的操作

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

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

    文件上传必须条件:

    1.  表单必须post

    2.  表单必须有 file 文件域

    3.  表单的 enctype="multipart/form-data"

    //SpringMVC中使用  MultipartFile file对象接受上传文件,必须保证 后台参数的名称和表单提交的文件的名称一致
        @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";
        }

    2.文件下载

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

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

    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 {
        }
    }


    1.  表单必须post

    2.  表单必须有 file 文件域

    3.  表单的 enctype="multipart/form-data"

  • 相关阅读:
    Mysql索引查询失效的情况
    常用的设计模式
    dubbo的实现原理
    HashMap和HashTable的区别
    SpringMVC工作原理的介绍
    SpringMVC 基础内容及使用步骤
    BeanFactory和ApplicationContext的区别+部分Spring的使用
    Spring常用的jar+普通构造注入
    如何在CentOS7上安装MySQL并实现远程访问
    如何搭建Spring MVC 框架---Hello World
  • 原文地址:https://www.cnblogs.com/WhiperHong/p/11172806.html
Copyright © 2011-2022 走看看