当前位置: 首页 > news >正文

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 超过指定大小,直接写文件到磁盘,不在内存处理。
      在这里插入图片描述
  • 不能只考虑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&#xff0c;这个库使用非常广泛。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标准模块&#xff08;内置模块&#xff0c;标准库&#xff09; 第三方模块/库&#xff08;pypi.org&#xff09; 自定义模块 二、模块的好处 可维护性更强 方便代码重用...

如何安全地多开Facebook/Twitter/TK/Ins等账号?

随着社交媒体的普及&#xff0c;人们需要在不同平台上管理多个账号。然而&#xff0c;如何安全地多开这些账号却是一个需要关注的问题。本文将介绍如何安全地多开Facebook、twitter、YouTube、TikTok等平台账号的方法。 重要关联因素&#xff1a; 1. 隐私和安全&#xff1a;保…...

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实现雷达图、六边形图表

说实话&#xff0c;要说图表里&#xff0c;最强的应该属于echarts了&#xff0c;不管是接入难度上&#xff0c;还是样式多样性上&#xff0c;还有社区庞大程度上&#xff0c;都是首屈一指的&#xff0c;反观有的人习惯用chart.js了&#xff0c;这个无可厚非&#xff0c;但是如果…...

JUC并发编程-四大函数式接口、Stream 流式计算、ForkJoin并行执行任务

12. 四大函数式接口 新时代的程序员&#xff1a;lambda表达式、链式编程、函数式接口、Stream流式计算 函数式接口&#xff1a;只有一个方法的接口&#xff0c;可以有一些默认的方法 如&#xff1a;Runnable接口函数 1&#xff09;Function 函数型接口 public class Functio…...

【Tomcat与网络4】Tomcat的连接器设计

目录 1 如何设计一个灵活可靠的连接器 2 主要组件介绍 在上一篇&#xff0c;我们介绍了Tomcat提供服务的整体结构&#xff0c;本文我们一起来看一下Tomcat的连接器的设计。 在前面我们提到Tomcat主要完成两个功能&#xff1a; 处理 Socket 连接&#xff0c;负责网络字节流与…...

k8s中调整Pod数量限制的方法

一、介绍 Kubernetes节点每个默认允许最多创建110个pod&#xff0c;有时可能由于主机配置扩容的问题&#xff0c;从而需要修改节点pod运行数量的限制。 即&#xff1a;需要调整Node节点的最大可运行Pod数量。 一般来说&#xff0c;只需要在kubelet启动命令中增加–max-pods参数…...

在Java中,实现扩展性通常有几种方法,其中包括接口、抽象类、插件架构和服务加载等方式

在Java中&#xff0c;实现扩展性通常有几种方法&#xff0c;其中包括接口、抽象类、插件架构和服务加载等方式。以下是如何使用接口来实现灵活的扩展和插件管理的一些基本指导&#xff1a; 定义基础接口&#xff1a; 创建一个或多个基础接口&#xff0c;这些接口定义了所有实现…...

【乳腺肿瘤诊断分类及预测】基于自适应SPREAD-PNN概率神经网络

课题名称&#xff1a;基于自适应SPREAD-PNN的乳腺肿瘤诊断分类及预测 版本日期&#xff1a;2023-06-15 运行方式: 直接运行PNN0501.m 文件即可 代码获取方式&#xff1a;私信博主或QQ&#xff1a;491052175 模型描述&#xff1a; 威斯康辛大学医学院经过多年的收集和整理&…...

蓝桥杯AT24C02问题记录

问题1&#xff1a;从这个图片上可以看出这两个在IIC的.c文件里延时时间不一样&#xff0c;第一张图使用了15个_nop_(); 12M晶振机器周期是 1/12M*121uS&#xff1b;nop()要延时1个指令周期。延时时间不对会对时序产生影响&#xff0c;时序不对&#xff0c;则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…...

订婚支出及共同生活消费是否属于彩礼?应否返还?

恋爱期间&#xff0c;男女双方为增进情感而互赠财物的现象十分普遍。而当双方关系结束时&#xff0c;赠送财物的一方要求对方返还时&#xff0c;法院能否支持其主张&#xff1f; 一起男方向女方及女方母亲索要彩礼及恋爱期间花销钱款引发的婚约财产纠纷案&#xff0c;法院综合双…...

MicroPython核心:优化

MicroPython使用多种优化方法来节省RAM&#xff0c;同时确保程序的高效执行&#xff0c;本文会讨论其中的一些优化。 提示&#xff1a; MicroPython 字符串驻留&#xff08;string interning&#xff09; 和映射和字典(Maps and Dictionaries) 详细介绍了对字符串和字典的其他…...

Opencv——霍夫变换

霍夫直线变换 霍夫直线变换(Hough Line Transform)用来做直线检测 为了加升大家对霍夫直线的理解,我在左图左上角大了一个点,然后在右图中绘制出来经过这点可能的所有直线 绘制经过某点的所有直线的示例代码如下,这个代码可以直接拷贝运行 import cv2 as cv import matplot…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...

PH热榜 | 2025-06-08

1. Thiings 标语&#xff1a;一套超过1900个免费AI生成的3D图标集合 介绍&#xff1a;Thiings是一个不断扩展的免费AI生成3D图标库&#xff0c;目前已有超过1900个图标。你可以按照主题浏览&#xff0c;生成自己的图标&#xff0c;或者下载整个图标集。所有图标都可以在个人或…...

python基础语法Ⅰ

python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器&#xff0c;来进行一些算术…...

Qt/C++学习系列之列表使用记录

Qt/C学习系列之列表使用记录 前言列表的初始化界面初始化设置名称获取简单设置 单元格存储总结 前言 列表的使用主要基于QTableWidget控件&#xff0c;同步使用QTableWidgetItem进行单元格的设置&#xff0c;最后可以使用QAxObject进行单元格的数据读出将数据进行存储。接下来…...

在ubuntu等linux系统上申请https证书

使用 Certbot 自动申请 安装 Certbot Certbot 是 Let’s Encrypt 官方推荐的自动化工具&#xff0c;支持多种操作系统和服务器环境。 在 Ubuntu/Debian 上&#xff1a; sudo apt update sudo apt install certbot申请证书 纯手动方式&#xff08;不自动配置&#xff09;&…...

Unity-ECS详解

今天我们来了解Unity最先进的技术——ECS架构&#xff08;EntityComponentSystem&#xff09;。 Unity官方下有源码&#xff0c;我们下载源码后来学习。 ECS 与OOP&#xff08;Object-Oriented Programming&#xff09;对应&#xff0c;ECS是一种完全不同的编程范式与数据架构…...