Spring Boot学习随笔- 文件上传和下载(在线打开、附件下载、MultipartFile)

学习视频:【编程不良人】2021年SpringBoot最新最全教程

第十二章、文件上传、下载

文件上传

文件上传是指将文件从客户端计算机传输到服务器的过程。

  • 上传思路

    • 前端的上传页面:提交方式必须为postenctype属性必须为multipart/form-data
    • 开发后端的Controller
    • 后端方法接收参数必须和前端标签的name名一致
  • upload.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>文件上传</title>
    </head>
    <body>
        <h1>测试文件上传</h1>
        <form action="${pageContext.request.contextPath}/file/upload" method="post" enctype="multipart/form-data">
            <input type="file" name="file">
            <input type="submit" value="上传文件">
        </form>
    </body>
    </html>
    
  • Controller

    @Controller
    @RequestMapping("file")
    public class FileController {
    
        private final Logger log = LoggerFactory.getLogger(FileController.class);
    
        /**
         * 测试文件上传
         */
        @RequestMapping("upload")
        public String upload(MultipartFile file, HttpServletRequest request) throws IOException { // 变量名要和form的input type="file"的name名一致
            log.debug("文件名:{}", file.getOriginalFilename());
            log.debug("文件大小:{}", file.getSize());
            log.debug("文件类型:{}", file.getContentType());
            // 处理文件上传 根据相对路径 上传 upload 获取绝对路径(真实路径) /users/desktop
            String realpath = request.getSession().getServletContext().getRealPath("/upload");
            log.debug("获取绝对路径:{}", realpath);
            // 修改文件名
            String fileName = file.getOriginalFilename();
            int i = fileName.lastIndexOf(".");
            String suffix = fileName.substring(i);
            String newFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())+suffix;
            // 上传文件 参数1将文件写进目录
            file.transferTo(new File(realpath,newFileName));
            return "redirect:/upload.jsp";
        }
    }
    

修改上传文件大小限制

当上传文件超过10M则会报错

  • 修改配置

    spring:
    	servlet:
    	  multipart:
    	    max-request-size: 120MB # 运行请求传递文件大小
    	    max-file-size: 120MB  # 运行服务器可以处理的最大文件大小
    

传统上传方式不适用于Jar包部署Linux

在传统的Spring Boot 应用程序中,当你在 Linux 上通过 JAR 包部署后,绝对路径上传文件会失效的原因是因为 JAR 包中的文件无法通过绝对路径进行访问。

  • 修改上传方式(文件上传位置解耦合)

    @Value("${file.upload.dir}")
    private String **realPath**;
    
    /**
     * 【推荐】适用于任何一种部署方式
     * @param file
     * @return
     * @throws IOException
     */
    @RequestMapping("uploadByJarDeploy")
    public String uploadByJarDeploy(MultipartFile file) throws IOException {
        log.debug("文件名:{}", file.getOriginalFilename());
        log.debug("文件大小:{}", file.getSize());
        log.debug("文件类型:{}", file.getContentType());
        // 修改文件名
        String fileName = file.getOriginalFilename();
        int i = fileName.lastIndexOf(".");
        String suffix = fileName.substring(i);
        String newFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + suffix;
        // 文件上传
        file.transferTo(new File(**realPath**,newFileName));
        return "redirect:/upload.jsp";
    }
    
  • 配置

    # 指定文件上传位置
    file:
      upload:
        dir: D:\Desktop\test\photo 
    

文件下载

文件下载是指从服务器获取文件并保存到本地计算机或设备的过程。

  • 开发步骤

    1. 确定项目中哪些资源可以被下载
    2. 将可以被下载资源放入服务器指定位置
    3. 项目中开发一个下载页面/提供下载文件的链接
    4. 开发下载controller
  • controller

    @Controller
    @RequestMapping("file")
    public class FileController {
    
        private Logger log = LoggerFactory.getLogger(FileController.class);
    
        @Value("${file.download.dir}")
        private String realPath;
    
        /**
         * 文件下载
         * @param fileName
         */
        @RequestMapping("download")
        public void download(StringopenStyle, String fileName, HttpServletResponse response) throws IOException {
    openStyle=openStyle==null?"inline":"attachment";
            log.debug("当前下载文件名:{}", fileName);
            log.debug("当前下载目录:{}", realPath);
            // 1.指定目录中读取文件
            File file = new File(realPath, fileName);
            // 2.将文件读取为文件输入流
            FileInputStream is = new FileInputStream(file);
            // 3.获取响应输出流
            response.setContentType("text/plain;charset=UTF-8");
            ServletOutputStream os = response.getOutputStream();
            // 4.附件下载文件  attachment(附件)  inline(在线打开)
            response.setHeader("content-disposition",openStyle+";fileName=" + URLEncoder.encode(fileName,"UTF-8"));
            // 5.输入流复制给输出流
            // 传统写法
    //        int len = 0;
    //        byte[] b = new byte[1024];
    //        while (true) {
    //            len = is.read(b);
    //            if (len == -1) {
    //                break;
    //            }
    //            os.write(b, 0, len);
    //        }
    //        is.close();
            // spring提供的复制方法,会自动释放is和os
            FileCopyUtils.copy(is, os);
        }
    }
    
  • download.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>下载</title>
    </head>
    <body>
        <h1>文件下载</h1>
        <ul>
            <li>
                help.md
                <a href="${pageContext.request.contextPath}/file/download?fileName=HELP.md">在线打开</a>
                <a href="${pageContext.request.contextPath}/file/download?fileName=HELP.md&openStyle=attachment">附件下载</a>
            </li>
            <li>
                springmvc.png
                <a href="${pageContext.request.contextPath}/file/download?fileName=20231219161718427.png">在线打开</a>
                <a href="${pageContext.request.contextPath}/file/download?fileName=20231219161718427.png&openStyle=attachment">附件下载</a>
            </li>
        </ul>
    </body>
    </html>
    

下一章:Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署

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

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

相关文章

【STL容器】详解list的使用和模拟实现

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; STL函数专栏 &#x1f319;请不要相信胜利就像山坡上的蒲公英一…

Axure--中继器(增删改查)

&#x1f4da;&#x1f4da; &#x1f3c5;我是bing人&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Axure》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一…

龙迅LT86102UXE HDMI一分二HDMI,支持音频剥离,支持4K60HZ

描述&#xff1a; 龙迅 LT86102UXE HDMI2.0 分路器具有符合 HDMI2.0/1.4 规范的 1&#xff1a;2 分路器、最大 6Gbps 高速数据速率、自适应均衡 RX 输入和预加重 TX 输出&#xff08;用于支持长电缆应用&#xff09;、内部 TX 通道交换以实现灵活的 PCB 布线。 LT86102UXE HDM…

Python importlib模块详细教程

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com importlib模块是Python标准库中用于动态导入模块的工具。它提供了一系列函数&#xff0c;允许以编程方式加载、检查和操作模块。本文将深入探讨importlib的各种用法&#xff0c;并通过丰富的示例代码帮助你更好地…

Python 时间日期处理库函数

标准库 datetime >>> import datetime >>> date datetime.date(2023, 12, 20) >>> print(date) 2023-12-20 >>> date datetime.datetime(2023, 12, 20) >>> print(date) 2023-12-20 00:00:00 >>> print(date.strfti…

fv悬浮球恢复备份配置主界面闪退问题解决方法

错误环境&#xff1a; 闪退版本120.0.6099.43 正常版本104.0.5112.97 当fv悬浮球恢复过往的备份配置后打开出现主界面闪退&#xff0c;但是其他功能仍然一切正常&#xff0c;例如应用启动器&#xff0c;分享保存 问题原因&#xff1a;因为安卓系统以往的Android System Web…

Iview Tooltip显示不换行,被遮挡

部分使用slot 方式无法解决 <Tooltip placement"top"> <Button>多行</Button> <div slot"content"> <p>显示多行信息</p> <p><i>可以自定义样式</i></p> </div> </Tooltip> 所以…

完整的 nuxt3 + vue + ts 服务端渲染项目搭建教程,克隆就能用,新手必学,建议收藏

目录 前言 一、新建仓库 1.1 新建 gitee 仓库 1.2 克隆到本地 二、初始化 nuxt 项目 2.1 初始化 nuxt 2.1.1 使用什么包管理工具 2.1.2 是否初始化 git仓库 2.1.3 整理项目结构 2.1.4 提交代码 2.2 运行项目 2.2.1 运行 npm run dev 2.2.2 增加 .nvmrc 文件 2.2.…

孩子还是有一颗网安梦——Bandit通关教程:Level 16 → Level 17

&#x1f575;️‍♂️ 专栏《解密游戏-Bandit》 &#x1f310; 游戏官网&#xff1a; Bandit游戏 &#x1f3ae; 游戏简介&#xff1a; Bandit游戏专为网络安全初学者设计&#xff0c;通过一系列级别挑战玩家&#xff0c;从Level0开始&#xff0c;逐步学习基础命令行和安全概念…

对大学生创新创业某赛事目前存在的烂尾楼现象的一些研究的分享(1)

经过对”某某网”大学生创新创业大赛国赛第五届-第八届部分金奖项目的研究&#xff0c;进行较为充分的信息溯源、穿透调查&#xff0c;我发现不少项目存在赛事材料画大饼&#xff0c;严重不切合实际&#xff0c;参赛人员并非真正创新创业&#xff0c;赛后迅速销声匿迹、烂尾切割…

MFC 消息映射机制

目录 消息映射机制概述 宏展开 宏展开的作用 消息映射机制的执行流程 消息处理 消息映射机制概述 MFC的消息映射映射机制是可以在不重写WindowProc虚函数的大前提下&#xff0c;仍然可以处理消息。 类必须具备的要件 类内必须添加声明宏 DECLARE_MESSAGE_MAP() 类外…

刷题记录第五十一天-去除重复字母

题目要求的是字典序最小的结果。只需要理解一点就是按大小顺序排列的字符串的字典序就是最小的&#xff0c;如“abcd”这种。 解题思路如下&#xff1a; 首先明确要使用栈结构&#xff0c;并且是从栈底到栈顶递增&#xff0c;要尽可能保证递增&#xff0c;这样就能保证字典序最…

exsi 6.5 添加RTL8111/8168/8411 网卡驱动重新打包

参考安装esxi时候的No Network Adapters报错 解决办法-CSDN博客 lspci 查看网卡型号 RTL8111/8168/8411 PCI Express 驱动下载地址 List of currently available ESXi packages - V-Front VIBSDepot Wiki 注入驱动程序 https://vibsdepot.v-front.de/tools/ESXi-Customi…

mysql 23-2day 数据库查询(DQL)

目录 数据库查询(DQL)环境&#xff1a;准备一个表格作为查询环境查看数据根据要求查看数据运算查询as 可以修改字段名字 进行查询查询所有部门拼接两个字段查询 2017年入职的员工一个是空null 一个是空白查询 NULL集合排序查询查看有那些组通配符正则查询函数 数据库查询(DQL) …

传输层协议分析--第4关:UDP 包分析

任务描述 本关任务&#xff1a;能够掌握简单的 UDP 包分析。 相关知识 为了更好掌握本章内容&#xff0c;你需要了解的有&#xff1a; UDP 报文的简介&#xff1b;UDP 报文格式&#xff1b;Wireshark 软件中的 UDP 抓包分析。 UDP 简介 UDP&#xff08;User Datagram Pro…

Python与Flink的完美融合:合流基本操作解析

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Apache Flink 是一个流式处理框架&#xff0c;支持复杂事件处理和大规模数据分析。在 Flink 中&#xff0c;合流&#xff08;Join&#xff09;是一种常见的操作&#xff0c;用于将两个或多个流中的数据按照指定条…

12.21 汇编点亮STM32MP157小灯

.text .global _start _start: 时钟使能pb6 pf6 pe9LDR r0,0x50000A28LDR r1,[r0]ORR r1,r1,#(0x1<<4)ORR r1,r1,#(0x1<<5)ORR r1,r1,#(0x1<<1)STR r1,[r0]配置GPIO模式LDR r0,0x50006000LDR r1,[r0]BIC r1,r1,#(0x2<<20)ORR r1,r1,#(0x1<<20)B…

【UE】阅读和理解距离剔除源码

距离剔除 官方文档&#xff1a;虚幻引擎中的剔除距离体积 | 虚幻引擎5.2文档 (unrealengine.com) 距离剔除&#xff0c;顾名思义&#xff0c;是根据距离来将场景对象的渲染进行加卸载的一种管理方式。 用距离剔除&#xff0c;可以减轻场景同时渲染大量物品的情况&#xff0c;…

ACM32F42x/4x3优势有那些?可应用在那些场景上?

优势 • 最大4MB Flash&#xff0c;可用于同时存储程序代码静态图片 • 128KB/196KB SRAM用于程序堆栈部分图片缓存 • 叠封最大8MB PSRAM&#xff0c;用于大容量图片缓存 • 180MHz M33内核&#xff0c;处理性能极佳 • 可选QFN32(4x4)、QFN48(5x5)小封装&#xff0…

动画渲染需要什么配置电脑?动画云渲染有什么优惠?

​在电影制作、游戏开发、广告设计以及其他设计领域&#xff0c;CG&#xff08;计算机图形学&#xff09;这一发展迅速、并融合了艺术创作与科技应用的领域发挥了重大作用。对于追求在 CG 创作中达到卓越表现的人来说&#xff0c;拥有一台高性能电脑设备至关重要。为此&#xf…
最新文章