• 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"

  • 相关阅读:
    大数据技术(1-5题)
    如何使用不同的编程语言来造一匹马
    Redis 数据类型及应用场景
    Swoole中内置Http服务器
    redis 数据库主从不一致问题解决方案
    easyswoole对接支付宝,微信支付
    PHP+Swoole 作为网络通信框架
    基于swoole实现多人聊天室
    swoole与php协程实现异步非阻塞IO开发
    swoole中使用task进程异步的处理耗时任务
  • 原文地址:https://www.cnblogs.com/WhiperHong/p/11172806.html
Copyright © 2020-2023  润新知