SpringMvc(四)- 下载,上传,拦截器

1、图片下载

图片下载:将服务器端的文件以流的形式写到客户端,通过浏览器保存到本地,实现下载;

1.1 图片下载步骤

1.通过session获取上下文对象(session.getServletContext())

​ session.getServletContext()

2.获取 服务器上的图片文件(输入流)

​ InputStream inputStream = servlet.getResourceAsStream(“pic/dsgl.jpg”);

3.定义缓存数组

​ byte[] bytes = new byte[inputStream.available()];

4.将目标文件读取到缓存数组

​ inputStream.read(bytes);

5.将目标图片文件封装到响应对象 ResponseEntity 中,响应给浏览器

​ 响应头数据:HttpHeaders httpHeaders = new HttpHeaders();

​ 响应码:HttpStatus httpStatus = HttpStatus.OK;

​ 响应的图片数据:return new ResponseEntity

1.2 请求方法

// 图片下载:将服务器端的文件以流的形式写到客户端,通过浏览器保存到本地,实现下载
@RequestMapping("/downloadPic")
public ResponseEntity testDownloadPic(HttpSession session) throws IOException {
    //读取服务器器上的图片文件,读取流对象,必须要借助session获取上下文对象
    InputStream inputStream = session.getServletContext().getResourceAsStream("pic/dsgl.jpg");

    //定义缓存数组,数组大小根据文件大小来定义
    byte[] bytes = new byte[inputStream.available()];

    //将目标文件读取到缓存数组
    inputStream.read(bytes);

    //将目标图片文件封装到响应对象 ResponseEntity 中,响应给浏览器
    //ResponseEntity 响应对象,必须包含三个内容:响应头数据, 响应码(响应状态), 响应的图片数据

    HttpHeaders httpHeaders = new HttpHeaders();

    //响应头数据 attachment 代表附件(才可以下载)
    httpHeaders.add("Content-Disposition","attachment;filename=" + new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) +
                    ".jpg"); //UUID.randomUUID().toString().substring(0,8)+

    //响应码
    HttpStatus httpStatus = HttpStatus.OK;

    //响应的图片数据
    return new ResponseEntity(bytes,httpHeaders,httpStatus);

}

1.3 jsp

从服务器下载图片到本地

    点击下载图片

2、图片上传

2.1 图片上传步骤

1.获取上传的头像名称

​ String targetFilename = multipartFile.getOriginalFilename();

2.重新定义新的文件名

​ targetFilename = new SimpleDateFormat(“yyyy-MM-dd-HH-mm-ss”).format(new Date()) + targetFilename.substring(targetFilename.indexOf(“.”));

3.获取真实上传路径

​ String realFilePath = session.getServletContext().getRealPath(“upload”);

4.创建文件目录(如果不存在)

​ targetFilePath.mkdirs()

5.创建目标文件对象(用于存放要上传的图片)

​ File targetFile = new File(targetFilePath+”/”+targetFilename);

6.文件上传到服务器,组件自动支持功能

​ multipartFile.transferTo(targetFile);

7.设置回显头像

​ map.put(“targetHeadImage”,targetFilename);

2.2 jsp

本地图片上传到服务器

        选择个人头像:

    上传个人头像:

2.3 请求方法

//图片上传
//将本地图片上传到服务器
@RequestMapping(value = "/uploadPic",method = RequestMethod.POST)
public String testUploadPic(HttpSession session, @RequestParam("uploadHeadImage") MultipartFile multipartFile, Map map) throws IOException {

    //获取上传的头像名称
    String targetFilename = multipartFile.getOriginalFilename();
    System.out.println("------ 上传文件名"+targetFilename+" ------");

    //重新定义新的文件名,要保留上传文件的类型
    targetFilename = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + targetFilename.substring(targetFilename.indexOf("."));

    System.out.println("------ 新的文件名"+targetFilename+" ------");

    //上传文件,要保存服务器上的真实路径中,idea项目发布,默认不会放到目标tomcat中,
    String realFilePath = session.getServletContext().getRealPath("upload");

    System.out.println("------ 服务器真实路径"+realFilePath+" ------");

    //文件目录可能不存在,也不能人为干预,必须程序主动处理
    File targetFilePath = new File(realFilePath);

    if(!targetFilePath.exists()){
        //目标不存在,主动创建
        if(targetFilePath.mkdirs()){
            System.out.println("上传目录创建成功");
        }
    }

    //**创建目标文件对象
    File targetFile = new File(targetFilePath+"/"+targetFilename);

    //文件上传到服务器,只需要一步,组件自动支持功能
    multipartFile.transferTo(targetFile);

    //设置回显头像
    map.put("targetHeadImage",targetFilename);

    return "forward:hellopic.jsp";
}

2.4 配置文件 和 jars

2.4.1 配置文件


2.4.2 jars


    commons-fileupload
    commons-fileupload
    1.3.1

    commons-io
    commons-io
    2.4

3、拦截器

拦截器, 必须实现 HandlerInterceptor 接口

执行时机:
过滤器是在 DispatcherServlet处理之前拦截,拦截器是在 DispatcherServlet处理请求然后调用控制器方法(即我们自己写的处理请求的方法,用 @RequestMapping标注)之前进行拦截。

3.1 实现三个方法

3.1.1 preHandle

  • 执行时机: 调用目标请求处理器中的 目标请求处理方法前,执行此方法;
  • 调用处:在前端核心控制器的962行,不同spring版本不一样;
  • 执行次序:从第一个拦截器,依次往后执行所有拦截器的此方法,只要有一个拦截器返回false,一组请求就都过不去;
  • 返回值:
  • false:代表 不可以调用请求目标处理方法,即需要拦截请求;
  • true:代表 可以调用请求目标处理方法,即不需要拦截请求;

3.1.2 postHandle

  • 执行时机:在 调用目标请求处理器中的目标请求处理方法后,在 模型数据渲染之前,执行此方法;
  • 调用处:在前端核心控制器的974行,不同spring版本不一样;
  • 执行次序:从最后一个拦截器,依次往前执行所有拦截器的此方法;

3.1.3 afterCompletion

  • 执行时机:
  • 正常情况:
    • 没有拦截请求,也没有发生异常, 在调用目标请求处理器中的目标请求处理方法后,在模型数据渲染之后(获取,渲染,转发或者重定向等),执行此方法;
    • 调用处:在前端核心控制器的1059行,不同spring版本不一样,
    • 执行次序:从最后一个拦截器,依次往前执行所有拦截器的此方法
  • 异常情况:
    • 多个拦截器中, 其中一个拦截了请求(preHandle方法返回了false),此方法被调用, 且是从当前拦截器前一个拦截器开始倒序执行(第一个拦截器拦截除外);
    • 在前端核心处理器, 处理请求过程中发生了异常,此方法也会被调用, 原理和上面类似;
  • 小结: *所有通过的拦截器,都会执行此方法,释放资源,拦截请求的当前拦截器是不会执行此方法(包括其后的所有拦截器);

3.2 测试 (一个拦截器)

@Controller //将拦截器作为普通组件,不可以直接生效,必须将容器,加入到拦截器组中
public class FirstInterceptor implements HandlerInterceptor  {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println(" ------ FirstInterceptor  preHandle ------");

        return false; //返回false
        //return true; //返回true

    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

        System.out.println(" ------ FirstInterceptor  postHandle ------");

    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

        System.out.println(" ------ FirstInterceptor  afterCompletion ------");

    }
}

配置文件


请求方法

@RequestMapping("/testFirstInterceptor")
public String testSpringMvcInterceptor(){
    System.out.println(" ------ 测试SprigMvc的拦截器的目标处理方法1------ ");
    return "forward:index.jsp";
}

3.2.1 返回 false

只执行 perHandle方法,不执行 目标请求处理器中的目标请求处理方法

SpringMvc(四)- 下载,上传,拦截器

3.2.2 返回 true

执行 preHandle -> 执行目标请求处理器中的目标请求处理方法 -> postHandle -> afterCompletion

SpringMvc(四)- 下载,上传,拦截器

3.3 测试(两个拦截器)

3.3.1 都返回true

第二个拦截器

@Controller
public class SecondInterceptor implements HandlerInterceptor
{

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println(" ------ SecondInterceptor  preHandle ------");

       // return false;
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //执行顺序:一组执行器,从后往前执行
        System.out.println(" ------ SecondInterceptor  postHandle ------");

    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println(" ------ SecondInterceptor  afterCompletion ------");

    }
}

配置文件


请求方法

@RequestMapping("/testSecondInterceptor")
public String testSecondInterceptor(){
    System.out.println(" ------ 测试SprigMvc的拦截器的目标处理方法2------ ");
    return "forward:index.jsp";
}

3.3.1 两个都返回true

SpringMvc(四)- 下载,上传,拦截器

3.3.2 第一个 返回true,第二个返回false

SpringMvc(四)- 下载,上传,拦截器

Original: https://www.cnblogs.com/xiaoqigui/p/16669052.html
Author: 化羽羽
Title: SpringMvc(四)- 下载,上传,拦截器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621628/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 非华为电脑开启多屏协同

    非华为电脑开启多屏协同 配置 windows 10系统(五代i7的辣鸡配置) WIFI、蓝牙(网上说需要5GHz,但本人的电脑是2.4G的也是有效) 华为、荣耀手机(EMUI 10…

    数据库 2023年6月11日
    0113
  • mysql对属性的增删改

    修改表 alter table 创建表db 查看表 desc与describe desc table 查看建表语句show create table t1; 修改表名 alter …

    数据库 2023年6月9日
    0108
  • IO流思维导图

    IO流思维导图 IO思维导图总结 总览: 1.文件 public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 (几乎…

    数据库 2023年6月16日
    091
  • MurmurHash

    高运算性能,低碰撞率的hash算法 redis已经使用了。spring导入redis有这个类,可以体验一下package redis.clients.util; 引用redis后直…

    数据库 2023年6月9日
    090
  • Oracle培训-介绍与体系架构

    1979年,公司推出Oracle 2,这是计算机软件史上第一个由纯软件公司开发的商用关系型数据库管理系统。公司改名为”关系软件公司” (Relational…

    数据库 2023年6月11日
    0103
  • LeetCode 27. 移除元素

    给你一个数组nums和一个值val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用O(1)额外空间并 原地 修改输入数…

    数据库 2023年6月11日
    079
  • ASP.NET中的Menu控件在谷歌浏览器下显示异常的解决办法

    在App_Browsers文件夹中添加Browsers文件,内容如下: identification >capture >capabilities >contro…

    数据库 2023年6月11日
    078
  • MySQL实战45讲 12

    12 | 为什么我的MySQL会”抖”一下? 一条 SQL 语句,正常执行的时候特别快,但是 有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现…

    数据库 2023年5月24日
    079
  • Read View的可见性判断理解

    读了 @SnailMann大佬【MySQL笔记】正确的理解MySQL的MVCC及实现原理 收益颇丰,非常感谢! 但对其中如何判断事务是否可见性还是不太理解,于是作了本文,在原博客基…

    数据库 2023年6月16日
    077
  • 避坑!SimpleDateFormat不光线程不安全,还有这个隐患

    众所周知,SimpleDateFormat是多线程不安全的 下面这段代码通过多线程使用同一个SimpleDateFormat对象的parse方法, 多次执行代码来测试,可以看到会出…

    数据库 2023年6月9日
    095
  • 工具 | 常用 MySQL 内核 Debug 技巧

    作者:柯煜昌 顾问软件工程师目前从事 RadonDB MySQL 容器化研发,华中科技大学研究生毕业,有多年的数据库内核开发经验。 掌握 MySQL 内核源码的阅读和调试能力,不仅…

    数据库 2023年5月24日
    0111
  • 通过.frm和.idb文件恢复mysql数据库

    本文对该文章进行参考,地址https://baijiahao.baidu.com/s?id=1675966756498698574&wfr=spider&for=p…

    数据库 2023年5月24日
    099
  • 给小白的 PostgreSQL 容器化部署教程(上)

    作者:王志斌编辑:钟华龙 本文来自社区小伙伴 王志斌 的投稿。从小白的角度,带你一步步实现将 RadonDB PostgreSQL 集群部署到 Kubernetes 上。文章分为上…

    数据库 2023年5月24日
    0110
  • 解决 IDEA 2021.2.3 新建maven项目只有两个archetype项目模板的问题

    最近把我的 IDEA 版本更新到 2021.2.3 了,发生了一个比较有意思的问题,做个小小的记录 思路分析 在新的 IDEA 中配置完Maven之后,想要创建Maven项目的时候…

    数据库 2023年6月11日
    081
  • Centos7 离线安装K3s

    1、安装前准备 github地址:https://github.com/k3s-io/k3s/releases k3s二进制文件:k3s下载地址:github地址 / 百度网盘地址…

    数据库 2023年6月14日
    0105
  • CenoOS 7环境下编译OpenJDK8

    一、准备工作 1.1、不再使用”$make sanity”来检查编译环境,而是改用”$./configure” 1.2、不再使用an…

    数据库 2023年6月9日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球