如何在SpringBoot 优雅地实现文件的上传和下载

SpringBoot文件上传下载详解 下载的原理其实就是根据你要下载的文件名看看我们的磁盘中有没有这个文件对比一下文件名字,如果有就下载,没有就下载失败。首先理解一下文件上传的原理,其实就是把传过来的文件存到我们的磁盘上,既然要存磁盘所以我们得指定文件存储的路径等。这篇文章记录我自己的学习过程的SpringBoot的文件上传下载的代码的理解。代码写完了介绍问了,接下来测试一下看看我们的接口能不能用。可以看到上传成功了,也生成了文件名。首先先把代码写上,然后逐一理解。我的路径值得就是这个。 阅读详情

1.效果演示

 

2.技术栈

  • maven

  • springboot

  • mybatis-plus

  • mysql

  • thymeleaf

  • bootstrap

3.数据库表

​CREATE TABLE `t_upload_file` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `old_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `new_Name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `url_path` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `size` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `file_type` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `created_date` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8; 复制代码

4.创建 springboot 项目

 

​

5.引入依赖

这里我们主要引入以下依赖:

  • web

  • mybatis-plus

  • mysql 驱动

  • thymeleaf

  • commons-fileupload

  • lombok

commons-fileupload 是一个上传文件的组件,该组件封装了一些上传文件的方法。

<!-- web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- mybatis-plus 依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <!-- mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--thymeleaf--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> 复制代码

6.修改配置文件

这里主要包含数据源、thymeleaf、mybatis-plus 三个模块的配置。

 

7.代码生成

这里使用 mybatis-plus 的代码生成工具自动生成 controller、entity、service、mapper,极大地提高代码开发效率。

记得添加以下依赖:

<!-- 代码生成器 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> </dependency> 复制代码

输入表名然后运行该程序:

​

​

8.前端

前端主要使用了 thymeleaf 和 bootstrap。Thymeleaf 是一种模板引擎技术,bootstrap 是 Twitter 推出的前端开发框架。

新建 index.html 文件,分别引入 bootstrap 的 css 和 Thymeleaf 的命名空间。

​

9.文件列表功能

后端:

查询列表数据,封装到 model 里面,然后跳转到列表页面。

前端:

列表页面使用 Thymeleaf 常用的标签:

​

10.文件上传

前端表单发起 post 请求,切记 enctype 格式是 multipart/form-data。

<form method="post" enctype="multipart/form-data" th:action="@{/file/upload}"> <input type="file" name="multipartFile"> <input type="submit" style="margin-top:20px" value="点击上传" class="btn btn-primary btn-sm"/> </form> 复制代码

后端用 MultipartFile 类型的对象接收文件,然后将文件拷贝到固定格式文件夹下:

​

/项目根路径/static/files/20xx-xx-xx/xxxx.jpg 复制代码

其中上传文件的核心代码:

multipartFile.transferTo(new File(finalFile, newName)); 复制代码

我们发现 transferTo 方法核心还是 IO 的读写操作:

 

 

11.文件下载

1.先根据文件 id 查询文件信息,然后根据文件所在路径和文件名获取文件输入流。

2.设置响应头的扩展头、下载文件的名称。

3.获取文件输出流

4.关闭文件输入输出流

​

12.删除文件

1.先根据文件 id 查询文件信息,然后根据文件所在路径和文件名获取 file 对象。

2.如果 file 对象存在就删除该文件。

3.删除数据库中该文件信息。

​

13.项目完整代码

链接:https://pan.baidu.com/s/1LODyH8TcVxnKqYprPoOo7g?pwd=1234 提取码:1234

Spring Boot 实现文件上传下载功能 进入前端页面的 URL 为 http://localhost:8080/upload.html。该部分代码为 [2.2 文件上传功能实现](###2.2 文件上传功能实现) 的前端实现。文件下载则只是简单的 GET 请求。现有的 Web 框架都内置了处理文件上传的功能。指定了文件在请求体中的键,后端服务器将通过这个名称来获取文件数据。是用来表示上传的文件,服务器会自动解析该文件并进行处理。,并选择一个文件进行上传。将文件上传的具体逻辑抽象到一个。将文件上传的具体逻辑抽象到一个。请求,下载指定的文件。 阅读详情

相关推荐

基于Springboot和Mybatis的文件上传与下载

0. 前言 因为太久太久没有碰项目了(上一次还是2021年8月开发个人博客的时候),所以这一次打算从头到尾把整个学习和搭建的过程记录下来。 1. 简介 这是一个基于SpringBoot和Mybatis的企业级文件上传下载的实战项目,没有太多前端和UI的东西。 2. 链接 【编程不良人】基于SpringBoot和Mybatis企业级文件上传下载项目实战 1. 设计 1. 需求 用户登陆,展示用户的所有文件(文件如果是图片则在页面中显示图片) 完成文件的下载和在线打开(在线打开不计入下载次数) 在一张页面中完

三明治文鱼的博客 3124

SpringBoot实现文件上传下载详解

文件上传模块: 思路: MultipartFile用来接受前台传来的文件 transferTo方法:把这个文件路径所指向的文件上传到对应的目录下。

Rocky balboa 7278

Xilinx Blockset Counter计数器模块使用及参数配置

本文详细介绍了Simulink中Xilinx Blockset库Counter模块的使用以及参数说明。

白码王子小张的博客 1097

基于springboot文件上传和下载

基于springboot文件上传和下载

hyt_struggle的博客 5198

机械臂抓取前言

机械臂相关的笔记

weixin_64037619的博客 3910

深入解析Android14应用安装权限:从声明到授予的完整适配指南

本文深入解析Android14应用安装权限的适配方法,重点介绍了从权限声明到授予的完整流程。与Android13相比,Android14在权限管理机制上进行了重要调整,特别是通过AppOpsManager实现权限的对象化封装。文章详细讲解了权限声明的基础配置、Framework层适配方案、运行时权限授予方法以及常见问题排查指南,帮助开发者高效完成Android14权限适配。

o9p0q1的博客 696

SpringBoot 优雅地实现文件的上传和下载

这里使用 mybatis-plus 的代码生成工具自动生成 controller、entity、service、mapper,极大地提高代码开发效率。新建 index.html 文件,分别引入 bootstrap 的 css 和 Thymeleaf 的命名空间。1.先根据文件 id 查询文件信息,然后根据文件所在路径和文件名获取 file 对象。1.先根据文件 id 查询文件信息,然后根据文件所在路径和文件名获取文件输入流。是一个上传文件的组件,该组件封装了一些上传文件的方法。3.删除数据库中该文件信息。

java1527的博客 3311

基于Canfestival的对象字典工具objdictedit.py的运行环境配置

本文以菜狗的视角,一步一步地对对象字典的环境进行配置,旨在能给读者一个比较详细的参考,不恰之处,还请指正。

在线求职中... 3711

七、springBoot 简单优雅是实现文件上传和下载,spring集成mybatis原理

前言 配置 [cont 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》 【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享 roller 层](about:blank#controller__11) 测试 文件下载 下载第三方文件到服务器 删除文件 番外 前言 =================================================================..

m0_65441360的博客 291

node运行项目-Network: unavailable-没有ip地址

vscode运行vue项目后发现Network: unavailable 是什么情况呢?可能有一下三种情况:1.多个网卡原因:打开网络共享中心,把多余的网络禁用掉,只留一个2.在中配置host及public3.系统环境变量问题。

JackieDYH的博客 7541

高压控制单元与接触器 —— BMS电池的“高压大门”

高压接触器在BMS电池管理系统中扮演着“高压大门”的角色,负责控制电池包与整车高压母线的连接与隔离。接触器的工作原理基于线圈产生的磁力吸合接点,通过主触点接通高压电流路径,辅助触点检测状态,灭弧结构保护接点。预充电路的设计是为了避免直接连接大电容时产生的浪涌电流冲击,通过预充电阻逐步充电,确保系统安全上电。接触器控制策略包括顺序控制、辅助触点检测、温度监控、故障断电和背靠背MOS辅助控制,以确保系统的高效和安全运行。工程师在选择接触器型号、控制线圈、检测状态、软件冗余控制和预充失败保护等方面提供了具体建议。

weixin_43199439的博客 815

七、springBoot 简单优雅是实现文件上传和下载

前言 好久没有更新spring Boot 这个项目了。最近看了一下docker 的知识,后期打算将spring boot 和docker 结合起来。刚好最近有一个上传文件的工作呢,刚好就想起这个脚手架,将文件上传和下载整理进来。 配置 在application.properties 中增加上传文件存放的路径配置 #文件上传目录 file.upload.url=E:/test controlle...

程序员爱酸奶 1万+

OPTEE:TA命令操作的实现(三)

上文我们创建好了通道,现在就是操作,怎么操作TA呢?REE侧的CA执行创建会话操作成功后,CA就可使用获取到的调用来让TA执行特定的命令。通过ioctl的系统调用发送到OP-TEE的驱动中,保存在共享内存中,并触发安全监控模式调用(smc)切换到Monitor模式(ARMv7)或EL3(ARMv8)中进行安全世界状态的处理。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1268

springBoot 简单优雅是实现文件上传和下载

前言 好久没有更新spring Boot 这个项目了。最近看了一下docker 的知识,后期打算将spring boot 和docker 结合起来。刚好最近有一个上传文件的工作呢,刚好就想起这个脚手架,将文件上传和下载整理进来。 配置 在application.properties 中增加上传文件存放的路径配置 #文件上传目录 file.upload.url=E:/test controller 层 上传文件和下载文件都比较简单,我们就直接在controller层来编写。也不用在pom.xml 中增加什么

qq_43842093的博客 1090

实现真正的「人机」对战:引入三方 AI 引擎

引入三方 AI 引擎 前边,我们实现了与云库对战的象棋游戏。这一节中,我们将开始实现真正的「人机」对战 — 人与手机 AI 之间对弈; 实现一套象棋 AI 工程浩大,这个工作我们后续文章会做一番介绍。现代软件工程并不主张每个人都「造轮子」,因此我们要有「站在巨人肩膀上」的小智慧。 本节概要 从 github 寻找开源中象引擎 梳理引擎接入的思路 寻找适合的开源中国象棋引擎 github 上有大...

tosmart的博客 983

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

使用SPRINGBOOT优雅的实现文件上传

我们主要是做政府项目,客户也都是政府单位的,对用户体验要求比较高,要让他们感觉用的方便,对稳定性要求比较高,基本上一年365天都不希望你出问题,对安全性要求也比较高,涉密了,信创国产化,不能连外网的,都是内网。之前一般的做法都是使用HTML5来做的,大部都是传文件的,传文件夹的不多。网上搜到的SpringBoot的代码不多,完整的不多,能用的也不多,基本上大部分的文章只是提供了少量的代码,讲一下思路,或者实现方案。最好下载能够支持加密下载,在下载过程中数据是加密的,下载完后自动解密,主要是有安全需求。

alisky119的博客 580

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Spring Boot异常页面处理、文件上传与下载

404错误你的页面走丢了...

Q_ytsup5681的博客 664

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【苍穹外卖微服务改造】引入minio

本文带你手把手给苍穹外卖引入minio

逐梦苍穹的博客 2138

SpringBoot 实战,自定义 Filter 优雅获取请求参数和响应结果

Subclasses may use isAsyncDispatch(HttpServletRequest) to determine when a filter is invoked as part of an async dispatch, and use isAsyncStarted(HttpServletRequest) to determine when the request has been placed in async mode and therefore the current di..

m0_68629662的博客 2093

【SpringBoot新手篇】SpringBoot优雅文件上传方式

SpringBoot文件上传Pomymlcontroller`UploadController``FileController`文件上传多文件上传文件下载页面BUG 工作中上传文件是常见的场景之一,最典型的情况就是上传头像等,上传文档。自己上传文件中遇到的坑,自己已经填了,现在把它写下来,方便提醒自己,我使用的是Spring Boot 上传文件 Pom 主要引入了web和thymeleaf启动器 <!-- web start--> <dependency> <gro

输入技术、输出想法 7585
上一篇: 近40000字带你走完Spring Boot工程开发流程
下一篇: 浅析模块化单体会不会取代微服务架构
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值