Spring Boot 中文件上传
Spring Boot 中文件上传
- 一、MultipartFile
- 二、单文件上传案例
- 三、多文件上传案例
- 四、Servlet 规范
- 五、Servlet 规范实现文件上传
- 上传文件大家用的最多的就是 Apache Commons FileUpload,这个库使用非常广泛。Spring Boot3 版本中已经不能使用了。代替它的是 Spring Boot 中自己实现的文件上传。
- Spring Boot 上传文件现在变得非常简单。提供了封装好的处理上传文件的接口 MultipartReslover,用于解析上传文件的请求,它的内部实现类 StandardServletMultipartResolver。之前常用的 CommonsMultipartResolver 不能使用了。 CommonsMultipartResolver 是使用 Apache Commons File Upload 库时的处理类。
一、MultipartFile
- StandardServletMultipartResolver 内部封装了读取 POST 请求的请求体中的数据,也就是文件内容。我们只需要在 Controller 的方法中加入形参 @ReqestParam(“参数名”) MultipartFile file。MultipartFile 表示上传的文件,其提供了方便的方法保存文件到磁盘。
public interface MultipartFile extends InputStreamSource {String getName();//返回参数的名称@NullableString getOriginalFilename();//获取上传文件的名称@NullableString getContentType();//返回文件的内容类型boolean isEmpty();//判断是否为空,或者上传的文件是否有内容long getSize();//返回文件大小 以字节为单位byte[] getBytes() throws IOException;//将文件内容转化成一个byte[] 返回InputStream getInputStream() throws IOException;//返回InputStream读取文件的内容default Resource getResource() {return new MultipartFileResource(this);}//保存上传文件到目标Dest中void transferTo(File dest) throws IOException, IllegalStateException;default void transferTo(Path dest) throws IOException, IllegalStateException {FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));} }
二、单文件上传案例
- 创建两个静态页面,一个用来上传文件(使用表单的方式),另一个用来显示文件上传成功。(注意:静态资源放在 static 目录下,否则访问不到资源)
- 使用表单的方式上传文件必须满足的三个要求:
- ① enctype=“multipart/form-data”
- ② method=“post”
- ③ <input type=“file” value=“选择文件” name=“uploadFile”>
<!-- 文件名:uploadfile.html --> <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>上传文件</title> </head> <body><h3>上传文件</h3><div></div><form action="uploadFile" enctype="multipart/form-data" method="post">选择需要上传的文件:<input type="file" value="选择文件" name="uploadFile"> <br><input type="submit" value="上传文件"></form> </body> </html><!-- 文件名:upload_success.html --> <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>文件上传成功</title> </head> <body><h3>文件上传成功</h3> </body> </html> - 使用表单的方式上传文件必须满足的三个要求:
- 编写controller方法获取请求,然后保存文件。
@Controller public class UploadFileController {@PostMapping("/uploadFile")public String uploadFile(@RequestParam("uploadFile") MultipartFile multipartFile) throws IOException {//首先判断上传的文件是否为空if (!multipartFile.isEmpty()) {String suffix = ".unknown";//初始文件后缀为不知道String name = multipartFile.getOriginalFilename();//获取上传的文件名System.out.println(name);//获取文件的后缀if (name != null && name.indexOf(".") > 0) {suffix = name.substring(name.indexOf("."));}String dest = UUID.randomUUID() + suffix;//生成保存的文件名multipartFile.transferTo(new File("G:/files/" + dest));//保存文件到指定位置}//防止刷新,重复上传return "redirect:/upload_success.html";} } - 编写错误页面
- 在 SpringBoot 中 /static/error/5xx.html 文件 ===> 如果出现 5xx 的错误自动跳转到整个页面。
- 在 SpringBoot 中 /static/error/4xx.html 文件 ===> 如果出现 4xx 的错误自动跳转到整个页面 。
<!-- 文件名:5xx.html --> <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <h3>出现了 5XX 错误!!!</h3> </body> </html><!-- 文件名:4xx.html --> <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <h3>出现了 4XX 错误!!!</h3> </body> </html> - 设置上传文件的大小
- Spring Boot 默认单个文件最大支持1M,一次请求最大10M。改变默认值,需要修改 application.yml 配置文件。file-size-threshold 超过指定大小,直接写文件到磁盘,不在内存处理。

- Spring Boot 默认单个文件最大支持1M,一次请求最大10M。改变默认值,需要修改 application.yml 配置文件。file-size-threshold 超过指定大小,直接写文件到磁盘,不在内存处理。
- 不能只考虑SpingBoot每次请求的文件最大大小,还需要设置服务器每次请求的大小。
三、多文件上传案例
- 多文件上传,在接收文件参数部分有所改变 MultipartFile[] files。循环遍历数组解析每一个上传的文件。
- 前端通过 form 表单上传多文件。
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>上传文件</title> </head> <body><h3>上传文件</h3><div></div><form action="uploadFile" enctype="multipart/form-data" method="post">选择需要上传的文件 1:<input type="file" value="选择文件" name="uploadFile"> <br>选择需要上传的文件 2:<input type="file" value="选择文件" name="uploadFile"> <br>选择需要上传的文件 3:<input type="file" value="选择文件" name="uploadFile"> <br><input type="submit" value="上传文件"></form> </body> </html>
四、Servlet 规范
-
Servlet3.0 规范中,定义了 Jakarta.servlet.http.Part 接口处理 mulitipart/form-data POST 请求中接收到的表单数据。有了 Part 对象,其 write() 方法将上传文件保存到服务器本地的磁盘中。
-
在 HttpServletRequest 接口中引入的新方法:
- getParts():返回 Part 对象的集合。
- getPart(字符串名称):检索具有给定名称的单个 Part 对象。
-
Spring Boot3 使用的 Servlet 规范是基于 5 的,所以上传文件使用的就是 Part 接口。
-
StandardServletMultipartResolver 对 Part 接口进行的封装,实现基于 Servlet 规范的文件上传。
public interface Part {InputStream getInputStream() throws IOException;//获取输入流用于检索文件的内容String getContentType();//获取文件内容类型String getName();//获取file控件的name属性String getSubmittedFileName();//获取上传文件名Servlet3.1 Tomcat8.0实现long getSize();//获取上传文件的大小void write(String fileName) throws IOException; //将文件内容写入指定的磁盘位置void delete() throws IOException;//删除Part数据和临时目录数据,默认会删除String getHeader(String name);//获取指定请求头Collection<String> getHeaders(String name);//获取指定header名称的集合数据Collection<String> getHeaderNames();//获取所有请求头的名称 }
五、Servlet 规范实现文件上传
@PostMapping("/files")public String upload(HttpServletRequest request){try {for (Part part : request.getParts()) {String fileName = extractFileName(part);part.write(fileName);}} catch (IOException | ServletException e) {throw new RuntimeException(e);}return "redirect:/upload_success.html";}private String extractFileName(Part part) {String contentDis = part.getHeader("content-disposition");String[] items = contentDis.split(";");for (String s : items) {if (s.trim().startsWith("filename")) {return s.substring(s.indexOf("=") + 2, s.length()-1);}}return "";}
- 上传文件包含 header 头 content-disposition,类似如下的内容,可获取文件原始名称。
- form-data; name=“dataFile”;filename=“header.png”
- application.yal 文件,可配置服务器存储文件位置,例如:
- spring.servlet.multipart.location=G:/files/
相关文章:
Spring Boot 中文件上传
Spring Boot 中文件上传 一、MultipartFile二、单文件上传案例三、多文件上传案例四、Servlet 规范五、Servlet 规范实现文件上传 上传文件大家用的最多的就是 Apache Commons FileUpload,这个库使用非常广泛。Spring Boot3 版本中已经不能使用了。代替它的是 Sprin…...
2023年06月CCF-GESP编程能力等级认证Python编程一级真题解析
一、单选题(共15题,共30分) 第1题 以下不属于计算机输出设备的有()。 A:麦克风 B:音箱 C:打印机 D:显示器 答案:A 第2题 ChatGPT 是 OpenAI 研发的聊天机器人程序,它能通过理解和学习人类的语言来进行对话,还能根据聊天的上下文进行互动,完成很多工作。请你…...
unity 使用数字图片来代替数字0到9显示
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Trackracecomplete : MonoBehaviour { /// /// 数字图片 /// [SerializeField] private Sprite[] sprites; private string _Time “23:57:49”; [Ser…...
单片机如何实现延时1ms或者1us
1us //适配主频为120MHz的单片机 void Delay_us(int16_t nus) {int32_t temp; SysTick->LOAD nus*15; //120MHzSysTick->VAL0X00;SysTick->CTRL0X01;do { tempSysTick->CTRL;}while((temp&0x01)&&(!(temp&(1<<16))));SysTick->CTRL0x0…...
全国网络安全行业职业技能大赛WP
word_sercet 文档被加密 查看图片的属性 在备注可以看到解压密码 解密成功 在选项里面把隐藏的文本显示出来 可以看到ffag easy_encode 得到一个bmp二维码 使用qr research 得到的密文直接放瑞士军刀 base32解码base64解码hex解码 dir_pcap 直接搜索flag 发现flag…...
【Python函数与模块】(7)模块的分类与好处
文章目录 一、模块分类二、模块的好处 一、模块分类 Python标准模块(内置模块,标准库) 第三方模块/库(pypi.org) 自定义模块 二、模块的好处 可维护性更强 方便代码重用...
如何安全地多开Facebook/Twitter/TK/Ins等账号?
随着社交媒体的普及,人们需要在不同平台上管理多个账号。然而,如何安全地多开这些账号却是一个需要关注的问题。本文将介绍如何安全地多开Facebook、twitter、YouTube、TikTok等平台账号的方法。 重要关联因素: 1. 隐私和安全:保…...
ChatGPT学python: 用json文件传参
目录 json语法最简陋版python解析语法小结 json语法最简陋版 param.json [{"Table_name": "table1","Event_name_colum": 4,"update_colum": 9},{"Table_name": "table2","Event_name_colum": 3,&quo…...
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
目录 1 -> 引用 1.1 -> 引用概念 1.2 -> 引用特性 1.3 -> 常引用 1.4 -> 使用场景 1.5 -> 传值、传引用效率比较 1.6 -> 值和引用作为返回值类型的性能比较 1.7 -> 引用和指针的区别 2 -> 内联函数 2.1 -> 概念 2.2 -> 特性 3 -…...
已实现:vue、h5项目如何使用echarts实现雷达图、六边形图表
说实话,要说图表里,最强的应该属于echarts了,不管是接入难度上,还是样式多样性上,还有社区庞大程度上,都是首屈一指的,反观有的人习惯用chart.js了,这个无可厚非,但是如果…...
JUC并发编程-四大函数式接口、Stream 流式计算、ForkJoin并行执行任务
12. 四大函数式接口 新时代的程序员:lambda表达式、链式编程、函数式接口、Stream流式计算 函数式接口:只有一个方法的接口,可以有一些默认的方法 如:Runnable接口函数 1)Function 函数型接口 public class Functio…...
【Tomcat与网络4】Tomcat的连接器设计
目录 1 如何设计一个灵活可靠的连接器 2 主要组件介绍 在上一篇,我们介绍了Tomcat提供服务的整体结构,本文我们一起来看一下Tomcat的连接器的设计。 在前面我们提到Tomcat主要完成两个功能: 处理 Socket 连接,负责网络字节流与…...
k8s中调整Pod数量限制的方法
一、介绍 Kubernetes节点每个默认允许最多创建110个pod,有时可能由于主机配置扩容的问题,从而需要修改节点pod运行数量的限制。 即:需要调整Node节点的最大可运行Pod数量。 一般来说,只需要在kubelet启动命令中增加–max-pods参数…...
在Java中,实现扩展性通常有几种方法,其中包括接口、抽象类、插件架构和服务加载等方式
在Java中,实现扩展性通常有几种方法,其中包括接口、抽象类、插件架构和服务加载等方式。以下是如何使用接口来实现灵活的扩展和插件管理的一些基本指导: 定义基础接口: 创建一个或多个基础接口,这些接口定义了所有实现…...
【乳腺肿瘤诊断分类及预测】基于自适应SPREAD-PNN概率神经网络
课题名称:基于自适应SPREAD-PNN的乳腺肿瘤诊断分类及预测 版本日期:2023-06-15 运行方式: 直接运行PNN0501.m 文件即可 代码获取方式:私信博主或QQ:491052175 模型描述: 威斯康辛大学医学院经过多年的收集和整理&…...
蓝桥杯AT24C02问题记录
问题1:从这个图片上可以看出这两个在IIC的.c文件里延时时间不一样,第一张图使用了15个_nop_(); 12M晶振机器周期是 1/12M*121uS;nop()要延时1个指令周期。延时时间不对会对时序产生影响,时序不对,则AT24C02有没被使用…...
adb控制设备状态
屏幕设置 屏幕亮度 # 当前屏幕亮度 adb shell settings get system screen_brightness# 更改屏幕亮度adb shell settings put system screen_brightness屏幕休眠时间 # 当前屏幕休眠时间 adb shell settings get system screen_off_timeout#更改屏幕休眠时间 adb shell sett…...
订婚支出及共同生活消费是否属于彩礼?应否返还?
恋爱期间,男女双方为增进情感而互赠财物的现象十分普遍。而当双方关系结束时,赠送财物的一方要求对方返还时,法院能否支持其主张? 一起男方向女方及女方母亲索要彩礼及恋爱期间花销钱款引发的婚约财产纠纷案,法院综合双…...
MicroPython核心:优化
MicroPython使用多种优化方法来节省RAM,同时确保程序的高效执行,本文会讨论其中的一些优化。 提示: MicroPython 字符串驻留(string interning) 和映射和字典(Maps and Dictionaries) 详细介绍了对字符串和字典的其他…...
Opencv——霍夫变换
霍夫直线变换 霍夫直线变换(Hough Line Transform)用来做直线检测 为了加升大家对霍夫直线的理解,我在左图左上角大了一个点,然后在右图中绘制出来经过这点可能的所有直线 绘制经过某点的所有直线的示例代码如下,这个代码可以直接拷贝运行 import cv2 as cv import matplot…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
