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/..../upload
            String realPath = request.getSession().getServletContext().getRealPath("/upload");
            // 2.将文件上传到upload对应路径
            img.transferTo(new File(realPath,img.getOriginalFilename()));
            return "index";
        }
    }
    
  • 文件上传细节处理

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

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

      		// 重命名:获取后缀,随机命名  substring | 工具类 commons
              String 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.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();
    }
    

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")**);
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode(49)用最少数量的箭引爆气球【区间】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 用最少数量的箭引爆气球 1.题目 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [x_start, x_end] 表示水平直径在 x_start 和 x_end之间的气球。你不知道气…

【WPF.NET开发】创建简单WPF应用

本文内容 先决条件什么是 WPF&#xff1f;配置 IDE创建项目设计用户界面 (UI)调试并测试应用程序 通过本文你将熟悉在使用 Visual Studio 开发应用程序时可使用的许多工具、对话框和设计器。 你将创建“Hello, World”应用程序、设计 UI、添加代码并调试错误。在此期间&#…

leetcode 142.环形链表2

我来更新 leetcode 题目了&#xff0c;接着上一次&#xff0c;这一次是上一道题目的提升&#xff08;有点数学题的感觉&#xff09; 142.环形链表2 题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表…

CCKS2023-面向上市公司主营业务的实体链接评测-亚军方案

赛题分析 大赛地址 https://tianchi.aliyun.com/competition/entrance/532097/information 任务描述 本次任务主要针对上市公司的主营业务进行产品实体链接。需要获得主营业务中的产品实体&#xff0c;将该实体链接到产品数据库中的某一个标准产品实体。产品数据库将发布在竞赛…

RK3568平台开发系列讲解(Linux系统篇) dtb 到 device_node 的转化

🚀返回专栏总目录 文章目录 一、dtb 展开流程二、dtb 解析过程源码分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍通过设备树 dtb 如何展开成 device_node 一、dtb 展开流程 设备树源文件编写: 根据设备树的基本语法和相关知识编写符合规范的设备树。…

工具类整理

常用工具类 在java的庞大体系中&#xff0c;其实有很多不错的小工具&#xff0c;也就是我们平常说的&#xff1a;轮子。 CollectionUtils 目前比较主流的是spring的org.springframework.util包下的CollectionUtils工具类。和apache的org.apache.commons.collections包下的Co…

根据豆瓣对《流浪地球》的短评数据进行文本分析和挖掘

1背景 2019年2月5日电影《流浪地球》正式在中国内地上映。该电影在举行首映的时候&#xff0c;口德好得出奇&#xff0c;所有去看片的业界大咖都发出了画样赞叹&#xff0c;文化学者能锦说:“中国科幻电影元年开启了。"导演徐峰则说&#xff0c;“里程碑式的电影&#xf…

实时流式计算 kafkaStream

文章目录 实时流式计算Kafka StreamKafka Streams 的关键概念KStreamKafka Stream入门案例编写SpringBoot 集成 Kafka Stream 实时流式计算 一般流式计算会与批量计算相比较 流式计算就相当于上图的右侧扶梯&#xff0c;是可以源源不断的产生数据&#xff0c;源源不断的接收数…

WEB服务器配置与HTTP分析

目录 实验目的&#xff1a; 实验要求&#xff1a; 实验原理&#xff1a; 实验步骤&#xff1a; 步骤1&#xff1a;创建拓扑 步骤2&#xff1a;为PC、Client和Server配置IPv4地址、子网掩码和域名服务器 步骤3&#xff1a;启动设备和服务器 步骤4&#xff1a;测试PC-1、C…

【Qt开发流程】之自定义语法高亮和使用HTML语法

描述 语法高亮&#xff08;Syntax Highlighting&#xff09;是一种在编辑器中突出显示代码语法元素的技术&#xff0c;使其更易于阅读和理解。 Qt提供了一个功能齐全的语法高亮框架&#xff0c;支持多种语言和格式&#xff0c;可以自定义颜色和样式。 对于使用Qt的开发人员来说…

HADOOP::Fsimage和Edits解析

NameNode被格式化之后&#xff0c;将在/opt/module hadoop-3.1.3/data/tmp/dfs/name/curent目录 中产生如下文件 fsimage_ 0000000000000000000 fsimage_ 0000000000000000000.md5 seen_txid VERSION (1) Fsimage文件: HDFS文件系统元数据的一个永久性的检查点&#xff0…

使用pytorch从零开始实现迷你GPT

生成式建模知识回顾: [1] 生成式建模概述 [2] Transformer I&#xff0c;Transformer II [3] 变分自编码器 [4] 生成对抗网络&#xff0c;高级生成对抗网络 I&#xff0c;高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II…

机器学习决策树ID3算法

1、先去计算总的信息量 2、根据不同指标分别计算对应的信息增益 3、根据算出的信息增益来选择信息增益最大的作为根结点 4、天气中选择一个继续上述过程 5、决策树划分结束

solidity实现ERC20代币标准

文章目录 1、以太坊 - 维基百科2、IERC203、ERC204、Remix 编译部署 1、以太坊 - 维基百科 以太坊&#xff08;Ethereum&#xff09;是一个去中心化的开源的有智能合约功能的公共区块链平台。以太币&#xff08;ETH 或 Ξ&#xff09;是以太坊的原生加密货币。截至2021年12月&a…

克服.360勒索病毒:.360勒索病毒的解密和预防

导言: 在数字化的今天&#xff0c;数据安全问题变得愈发棘手。.360勒索病毒是当前网络空间的一场潜在灾难&#xff0c;对于这个威胁&#xff0c;了解应对之道和采取切实的预防措施至关重要。如果您正在经历勒索病毒的困境&#xff0c;欢迎联系我们的vx技术服务号&#xff08;s…

华为手环配置技巧

前言 华为手环作为生活健康辅助设备发挥不可忽视的作用&#xff0c;但每次更换手环后需要重新配置。华为手环不仅有健康监测、消息通知、天气推送、离线支付、公交卡、运动锻炼、等功能&#xff0c;还有倒计时、计时器、手电筒、闹钟、等小工具。下文介绍如何进行配置。 配置…

C/C++学生选课/排课系统[2023-12-3]

问题描述&#xff1a;根据我校自动化专业的部分必修及选修课信 息&#xff0c;设计一个学生选课/排课系统。 基本要求&#xff1a; 1、从文件读入课程信息&#xff1b; 2、从键盘输入拟添加的选修课信息&#xff1b; 3、删除已选的选修课(1门或多门) &#xff1b; 4、输出已…

【小沐学Python】网络爬虫之lxml

文章目录 1、简介2、安装3、基本功能3.1 lxml.etree3.2 解析HTML网页3.3 读取并解析HTML文件3.4 提取所有a标签内的文本信息3.5 树迭代3.6 序列化3.7 元素以字典的形式携带属性3.8 元素包含文本 4、代码测试4.1 lxml解析网页4.2 使用xpath获取所有的文本4.3 使用xpath获取 clas…

html动漫网页设计分享 紫罗兰永恒花园网页作业成品带视频,注册登录,表格,表单

html5静态网页设计要是用HTML DIVCSS JS等来完成页面的排版设计,一般的网页作业需要融入以下知识点&#xff1a;div布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点&#xff0c;学生网页作业源码可以…

大数据-hive

简介 hive是基于Hadoop的一个数据仓库工具&#xff0c;用来进行数据提取、转化、加载&#xff0c;这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表&#xff0c;并提供SQL查询功能&#xff0c;能将SQL…