Spring MVC学习随笔-文件下载和上传(配置文件上传解析器multipartResolver)

学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅
学习视频:【编程不良人】继spring之后快速入门springmvc,面对SpringMVC不用慌

六、SpringMVC 文件上传下载

6.1 文件上传

  1. 定义

    指的是用户将自己本地计算机中文件通过网络上传到系统所在服务器上的过程称为文件上传。

  2. 需要用户提交文件时,必须开发文件上传功能

  3. SpringMVC中如何开发文件上传

    1. 在系统中开发一个文件上传页面,包含一个form表单,表单中开发一个本地计算机文件入口

    2. form表单 **method提交方式必须是post,**添加属性:enctype = application/x-www-form-urlencoded(文本) | multipart/form-data

    3. 在SpringMVC配置文件加入文件上传解析器配置

      注意:文件上传解析器必须存在id,且id必须为multipartResolver

    4. 引入文件上传的相关依赖

      commons-fileupload

  • 编码

    distpacher.xml 进行文件上传解析器的配置
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
    
    // 引入相关依赖
    <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version>
    </dependency>
    
    **// 传递的数据name属性名必须和控制器接受的形参名一致**
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head><title>upload</title>
    </head>
    <body><h1>文件上传</h1><form action="${pageContext.request.contextPath}/file/upload" method="post" enctype="multipart/form-data"><input type="file" name="**img**"/><input type="submit" value="上传文件"/></form>
    </body>
    </html>
    

    在服务器上放置文件夹接受上传文件的步骤:在webapp下面创建一个文件夹(不能是空文件夹) ⇒ maven执行clean ⇒ 重启服务器,target下会自动创建此文件夹

    **控制层 通过MultipartFile形参接受页面传过来的文件,形参名必须与数据名(name属性)一致**
    @Controller
    @RequestMapping("file")
    public class FileController {@RequestMapping("upload")public String upload(MultipartFile **img**, HttpServletRequest request) throws IOException {System.out.println("文件名" + img.getOriginalFilename());System.out.println("文件大小" + img.getSize());System.out.println("文件类型" + img.getContentType());// 文件上传// 1. 根据upload相对路径部署到服务之后的绝对路径 target/..../uploadString realPath = request.getSession().getServletContext().getRealPath("/upload");// 2.将文件上传到upload对应路径img.transferTo(new File(realPath,img.getOriginalFilename()));return "index";}
    }
    
  • 文件上传细节处理

    1. 如何修改文件上传的原始名称

      使用文件的原始名称做为上传文件的最终名称,会导致文件覆盖。所以每次用户上传文件需要修改一个新的名称。

      		// 重命名:获取后缀,随机命名  substring | 工具类 commonsString fileName = img.getOriginalFilename();
      //        int i = fileName.lastIndexOf(".");
      //        String name = fileName.substring(i);String extension = FilenameUtils.getExtension(fileName);String newFileName = UUID.randomUUID().toString().replace("-","")+"."+extension;// 2.将文件上传到upload对应路径img.transferTo(new File(realPath,newFileName));
      
    2. 对上传的文件进行管理,将用户每天上传的文件放入当天日期目录中?

      // 3. 生成当天日期目录
      LocalDate now = LocalDate.now();
      File dateDir = new File(realPath, now.toString());
      if (!dateDir.exists()) {dateDir.mkdirs();
      }
      // 4.将文件上传到upload对应路径
      **img.transferTo(new File(dateDir,newFileName));
      
    3. SpringMVC中如何解决文件上传的大小限制

      注意:在SpringMVC中默认上传没有大小限制,所以需要限制用户上传文件的大小限制

6.2 文件下载

  1. 定义

    用户将服务器文件下载到本地计算机的过程称为文件下载

  2. 开发文件下载

    1. 确定系统中哪些文件需要用户下载
    2. 将需要下载的文件放入指定下载目录中
    3. 开发一个页面提供文件下载链接
    4. 开发下载Controller
  • 编码

    <body><h1>文件下载</h1><a href="${pageContext.request.contextPath}/file/download?fileName=aa.txt">aa.txt</a>
    </body>
    
    /* 处理文件下载*/
    @RequestMapping("download")
    public void download(String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {System.out.println("下载文件的名称 = " + fileName);// 1. 根据下载相对目录获取下载目录在服务器部署之后的绝对目录String realPath = request.getSession().getServletContext().getRealPath("/down");// 2.通过文件输入流读取文件FileInputStream is = new FileInputStream(new File(realPath, fileName));// 3.获取响应输出流response.setContentType("text/plain;charset=UTF-8");ServletOutputStream os = response.getOutputStream();// 4.附件下载文件  attachment(附件)  inline(在线打开)response.setHeader("content-disposition", "attachment;fileName=" + fileName);// 5.处理下载流复制// aa.txtint len;byte[] b = new byte[1024];while (true) {len = is.read(b);if (len == -1) {break;}os.write(b, 0, len);}is.close();os.close();
    }
    

6.3 文件下载细节处理

  • 实现在线打开下载+附件下载的功能(如下图)

  • 编码

    **// 通过url传递的数据控制参数变为inline或attachment**
    /* 处理文件下载*/@RequestMapping("download")public void download(String **openStyle**, String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {**openStyle=openStyle==null?"inline":"attachment";**System.out.println("下载文件的名称 = " + fileName);// 1. 根据下载相对目录获取下载目录在服务器部署之后的绝对目录String realPath = request.getSession().getServletContext().getRealPath("/down");// 2.通过文件输入流读取文件FileInputStream is = new FileInputStream(new File(realPath, fileName));// 3.获取响应输出流response.setContentType("text/plain;charset=UTF-8");ServletOutputStream os = response.getOutputStream();// 4.附件下载文件  attachment(附件)  inline(在线打开)response.setHeader("content-disposition", **openStyle**+";fileName=" + fileName);// 5.处理下载流复制// 传统写法 aa.txt
    //        int len;
    //        byte[] b = new byte[1024];
    //        while (true) {
    //            len = is.read(b);
    //            if (len == -1) {
    //                break;
    //            }
    //            os.write(b, 0, len);
    //        }
    //        is.close();
    //        os.close();// 代替上面传统写法,commons包提供了io流更方便  操作io流使用IOUtils  操作file 用 FileUtils**IOUtils.copy(is, os);// 输入流拷贝到输出流IOUtils.closeQuietly(is);// 优雅关闭 安静关流IOUtils.closeQuietly(os);// 优雅关闭 安静关流**}
    
    <h1>文件下载</h1>
    <ul><li>aa.txt<a href="${pageContext.request.contextPath}/file/download?fileName=aa.txt">在线打开</a><a href="${pageContext.request.contextPath}/file/download?fileName=aa.txt&openStyle=attachment">附件下载</a></li><li>springmvc.png<a href="${pageContext.request.contextPath}/file/download?fileName=springmvc.png">在线打开</a><a href="${pageContext.request.contextPath}/file/download?fileName=springmvc.png&openStyle=attachment">附件下载</a></li><li>自我介绍.txt<a href="${pageContext.request.contextPath}/file/download?fileName=自我介绍.txt">在线打开</a><a href="${pageContext.request.contextPath}/file/download?fileName=自我介绍.txt&openStyle=attachment">附件下载</a></li>
    </ul>
    
  • 解决文件名为中文时,下载后文件名变为乱码的问题

    // 对fileName编码,转为UTF-8
    response.setHeader("content-disposition", openStyle+";fileName=" + **URLEncoder.encode(fileName,"UTF-8")**);
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/194969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【最通用版FPGA 实现 SPI 驱动】

最近研究了一下SPI协议的FPGA实现&#xff0c;发现网上很多大佬分享的方法都是针对某一特定的flash芯片或者某一传感器芯片来设计电路结构的。所以想根据SPI&#xff08;Serial Peripheral Interface&#xff09;的基本通讯协议实现一个通用版的SPI Master驱动。SPI在嵌入式领域…

同源策略与跨域

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 不论个人练习还是实际开…

HR看好的字符函数和字符串处理函数!!!

本篇会加入个人的所谓‘鱼式疯言’❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言,而是理解过并总结出来通俗易懂的大白话,我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的&#xff0c;可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 前言 在本篇…

mybatis整合(手动添加jar包方式)

操作步骤 创建数据库 建立user表 放入数据 1、创建javaweb工程并添加Jar包 用到的jar包 junit 用于测试 mybatis框架&#xff1a;mybatis-3.5.9.jar mysql数据库&#xff1a;mysql-connector-java-8.0.28.jar 2、添加MyBatis核心配置文件 <?xml version"1.0"…

Leetcode刷题详解——乘积为正数的最长子数组长度

1. 题目链接&#xff1a;1567. 乘积为正数的最长子数组长度 2. 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你求出乘积为正数的最长子数组的长度。 一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。 请你返回乘积为正数的最长子数组长度。 示…

什么是结构化数据?哪些OCR软件可将图片文字转为结构化数据?

结构化数据是指按照一定的数据模型组织和存储的数据&#xff0c;具有明确的数据类型和数据关系&#xff0c;并且可通过计算机程序进行处理和分析。这种数据通常存储在定义明确的模式中&#xff0c;例如数据库&#xff0c;采用表格的形式存储&#xff0c;每个数据项都有特定的字…

Mover Creator 用户界面

1 “开始”对话框 首次打开 Mover Creator 时&#xff0c;出现的第一个页面是“开始”对话框&#xff0c;如下所示。从这里开始&#xff0c;用户可以选择开始设计飞机、武器或发动机。在上述每种情况下&#xff0c;用户都可以创建新模型或编辑现有模型。 1.1 新建模型 如果用…

Apache Doris 详细教程(二)

5、doris的查询语法 5.1、doris查询语法整体结构 SELECT [ALL | DISTINCT | DISTINCTROW ] -- 对查询字段的结果是否需要去重&#xff0c;还是全部保留等参数 select_expr [, select_expr ...] -- select的查询字段 [FROM table_references [PARTITION…

94基于matlab的蚁群算法 (ACO) 对付的图像边缘检测问题

基于matlab的蚁群算法 (ACO) 对付的图像边缘检测问题。提出基于蚁群算法的边缘检测方法是能够建立一个信息素矩阵表示提出了一种在图像每个像素位置的边缘信息根据大量的蚂蚁的运动有哪些派去在图像上移动。此外&#xff0c;运动这些蚂蚁是由图像的局部变化驱动强度值。数据可更…

U1编译概述

文章目录 基本概念定义一些概念 编译流程词法分析语法分析语义分析、生成中间代码中间代码 代码优化生成目标程序五个阶段中都需要做的两件事符号表管理出错处理 总结 其他概念多层中间表示和遍&#xff08;PASS&#xff09;三端模式课程概述 基本概念 定义 用高级语言编制的…

【Java 基础】18 I/O流

文章目录 1.基本概念2.字节流3.字符流4.标准输入输出5.最佳实践 I/O流&#xff08;Input/Output 流&#xff09;是计算机程序中不可或缺的一部分&#xff0c; 往大了说所有的操作都是IO。Java 提供了强大而灵活的 I/O 框架&#xff0c;支持各种数据的 读取和 写入操作。 1.基…

45 - 多线程性能优化常见问题

1、使用系统命令查看上下文切换 上下文切换常见的监测工具 1.1、Linux 命令行工具之 vmstat 命令 vmstat 是一款指定采样周期和次数的功能性监测工具&#xff0c;我们可以使用它监控进程上下文切换的情况。 vmstat 1 3 命令行代表每秒收集一次性能指标&#xff0c;总共获取 …

【JavaSE】:String(二):深入String

深入String 一.字符串的存储二.字符串的不可变性三.字符串修改四.StringBuilder和StringBuffer 一.字符串的存储 我们知道双引号里的数据都是字符串常量&#xff0c;储存在字符串常量池当中。 例子 直接使用是比较地址。字符串常量池有一个特点&#xff1b;它会先检查该常量是否…

LLM-Intro to Large Language Models

LLM some LLM’s model and weight are not opened to user what is? Llama 270b model 2 files parameters file parameter or weight of neural networkparameter – 2bytes, float number code run parameters(inference) c or python, etcfor c, 500 lines code withou…

中介者模式 rust和java的实现

文章目录 中介者模式介绍实现javarustrust仓库 中介者模式 中介者模式&#xff08;Mediator Pattern&#xff09;又被称为 调停者模式 。 它定义了一个中介对象来封装一系列对象之间的交互关系。 中介者使各个对象之间不需要显式地相互引用&#xff0c;从而使耦合性降低&#…

计算机网络扫盲(4)——时延

一、概述 在这里&#xff0c;我们考虑分组交换网的情况&#xff0c;因特网可以被看成是一种基础设施&#xff0c;该基础设施为运行在端系统上的分布式应用提供服务。在理想情况下&#xff0c;我们希望因特网服务能够在任意两个端系统之间随心所欲地移动数据而没有任何数据地丢失…

韩语图片文字如何转为纯文本?

如何将上图为韩语的图片转为文本文件&#xff1f;这个需要用到OCR程序&#xff0c;操作方法如下&#xff1a; 一、打开金鸣识别网站。 二、点击“点击添加图片/PDF”&#xff0c;将待识别的图片添加到列表。 三、识别模块点选“通用文字”&#xff0c;输出格式选择“纯文本输出…

陀螺仪LSM6DSV16X与AI集成(1)----轮询获取陀螺仪数据

陀螺仪LSM6DSV16X与AI集成.1--轮询获取陀螺仪数据 概述视频教学样品申请通信模式管脚定义IIC通信模式速率生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置设置量程和速率配置过滤链轮询读取数据主程序演示 概述 本文将介绍如何使…

PPT设置背景颜色

问题描述&#xff1a;PPT如何设置背景颜色&#xff1f; 问题解决&#xff1a;设计→设置背景格式→颜色→蓝色&#xff08;最好选择看着比较舒服的颜色&#xff09;

如何通过缺口发现短线机会?

一、认识缺口形态 新手一开始接触技术分析&#xff0c;可能都以为“缺口”是一个很高深的技术形态。其实缺口很简单&#xff0c;就是K线图中的价格空白区域&#xff0c;也就是股价上涨或下跌的过程中&#xff0c;跳过了这个价格。根据跳空的方向不同&#xff0c;缺口可以分为向…