Java高级 | 【实验六】Springboot文件上传和下载
隶属文章:Java高级 | (二十二)Java常用类库-CSDN博客
系列文章:Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客
Java高级 | 【实验二】Springboot 控制器类+相关注解知识-CSDN博客
Java高级 | 【实验三】Springboot 静态资源访问-CSDN博客
Java高级 | 【实验四】Springboot 获取前端数据与返回Json数据-CSDN博客
Java高级 | 【实验五】Spring boot+mybatis操作数据库-CSDN博客
目录
一、实现步骤
1、配置文件上传位置和大小限制
2、创建文件上传表单页面
3、处理文件上传请求
4、提供文件下载接口
二、单文件上传
1、创建spring boot项目
2、修改文件上传的大小限制
3、创建前端页面
4、编写控制器
5、测试
(1)运行前端
(2)后端
三、多文件上传
1、在FileUpLoad类中增加如下方法
2、在FileController类中增加如下方法
3、在templates下创建一个名为“multFileUpload.html”的文件
4、测试
(1)前端
(2)后端
文件上传是web开发中最常见的功能之一,比如用户注册时需要上传头像,添加上商品信息时需要上传图片等信息。
Spring Boot中文件上传非常简单,通常使用Spring MVC的MultipartFile类来处理文件上传。
一、实现步骤
Spring Boot中实现文件上传和下载通常遵循以下步骤:
1、配置文件上传位置和大小限制
首先,需要在Spring Boot应用的配置文件(如application.properties)中配置文件上传的位置和大小限制。
2、创建文件上传表单页面
在前端创建一个包含文件上传表单的页面,通常使用HTML和表单标签来实现。表单中必须有一个input标签的type属性为file,用户通过这个输入框选择要上传的文件。
3、处理文件上传请求
在后端创建一个Controller来处理文件上传请求。这个Controller需要能够接收上传的文件,并将文件保存到指定的位置。在Spring Boot中,通常使用@RequestParam注解来接收MultipartFile对象,然后使用其transferTo()方法将文件保存到目标位置。
4、提供文件下载接口
创建另一个Controller来处理文件下载请求。这个Controller需要能够根据文件名或其他标识符找到对应的文件,并将其内容以流的形式返回给客户端。在Spring Boot中,你可以使用ResponseEntity来封装文件的响应,并设置适当的HTTP头部,使浏览器能够下载文件。
二、单文件上传
功能需求:
前端上传文件、文件名称和文件描述等相关信息。
后端获得前端上传的文件信息,并重新命名(新文件名称唯一)后保存到服务器指定的位置。
1、创建spring boot项目
如果新建项目, 注意勾选thymeleaf
这里直接使用实验一项目“springbootdemo1”,但要确保pom.xml
文件中包含了Thymeleaf的依赖。
//pom.xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
2、修改文件上传的大小限制
在application.properties文件输入如下代码:
spring.application.name=springbootdemo1
#file size
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
3、创建前端页面
本项目的前端页面采用thymeleaf
在resources->templates文件夹中创建一个名为upload.html的文件。
upload.html文件的代码如下所示:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>File Upload</title>
</head>
<body>
<h1>Upload a File</h1>
<form method="POST" enctype="multipart/form-data" action="/upfile/upload">名称:<input type="text" name="title"/><br>描述:<input type="text" name="description"><br>文件:<input type="file" name="file"/><input type="submit" value="上传文件"/>
</form>
</body>
</html>
注意:确保upload.htm
保存时使用的是UTF-8编码。如果文件保存时使用了其他编码(如GBK),可能会导致乱码。
4、编写控制器
本功能有两个控制器,FileController控制器用来运行前端,FileUpLoad 控制器用来保存上传的文件。
package controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("test")
public class FileController {@RequestMapping("file")public String test1() {return "upload";}
}
FileUpLoad控制去主要是获得前端上传文件的相关信息,修改文件的名称,保存文件到指定的位置。
package controller;import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
@RestController
@RequestMapping("upfile")
public class FileUpLoad {@PostMapping("/upload")public String handleFileUpload(@RequestParam("title") String title,@RequestParam("description") String description,@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {System.out.println(title+" : "+description);System.out.println(file.getOriginalFilename());//获得文件扩展名String originalFilename = file.getOriginalFilename();String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));System.out.println("扩展名:"+fileType);//如果上传的文件为空if (file.isEmpty()) {return "Please select a file to upload.";}//获得动态的路径String path=request.getServletContext().getRealPath("/upload/");System.out.println(path);saveFile(file,path,fileType);return "文件上传成功!";}private void saveFile(MultipartFile file, String path,String fileType) throws IOException {//上传文件名重新命名,唯一,防止重复String originalFilename = file.getOriginalFilename();String newFilename = UUID.randomUUID().toString() + fileType;//新文件对象File dest = new File(path+ newFilename);//判断文件存放的目录,如果不存在就创建文件存放的目录。File dir=new File(path);if(!dir.exists()){dir.mkdir();}//文件上传file.transferTo(dest);}
}
启动spring boot项目。
5、测试
(1)运行前端
在浏览器的url中输入http://localhost:8080/test/file,回车,输入上传文件的相关信息后点击上传文件。
(2)后端
Springboot的控制台输出的相关信息
文件保存的位置:
C:\Users\xx\AppData\Local\Temp\tomcat-docbase.8080.2289647245401549388\upload\
文件浏览:
三、多文件上传
1、在FileUpLoad类中增加如下方法
@PostMapping("/multiFileUpload")public String MultipartFileUpload(@RequestParam("title") String title,@RequestParam("description") String description,@RequestPart("one") MultipartFile mf,@RequestPart("any") MultipartFile[] mfs,HttpServletRequest request) throws IOException{System.out.println("单文件上传信息为:"+mf.getOriginalFilename());System.out.println("多文件个数:"+mfs.length);for (MultipartFile m:mfs){System.out.println("多文件信息:文件名称:"+m.getOriginalFilename()+",文件大小:"+m.getSize()/1000+"kb");}/*将文件上传到指定文件夹*/if (!mf.isEmpty()){String fileName=mf.getOriginalFilename();//文件上传mf.transferTo(new File("E:\\upload"+fileName));}if (mfs.length>0){for (MultipartFile m: mfs) {m.transferTo(new File("E:\\multi_upload"+m.getOriginalFilename()));}}return "成功";}
2、在FileController类中增加如下方法
@RequestMapping("multi_file")public String test2() {return "multFileUpload";}
3、在templates下创建一个名为“multFileUpload.html”的文件
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>File Upload</title>
</head>
<body>
<h1>Upload a File</h1>
<form method="POST" enctype="multipart/form-data" action="/upfile/multiFileUpload">名称:<input type="text" name="title"/><br>描述:<input type="text" name="description"><br>单个文件: <input type="file" value="上传单个文件" name="one" ><p>多个文件 <input type="file" value="上传多个文件" name="any" multiple><p><input type="submit" value="上传文件"/>
</form>
</body>
</html>
4、测试
测试路径:http://localhost:8080/test/multi_file
(1)前端
(2)后端
相关文章:

Java高级 | 【实验六】Springboot文件上传和下载
隶属文章:Java高级 | (二十二)Java常用类库-CSDN博客 系列文章:Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...
RKNN开发环境搭建1-基于Ubuntu 18.04系统使用Docker安装rknn-toolkit2
目录 写在最前面Docker 方式安装rknn-toolkit2写在最前面 瑞芯微在RKNN的环境搭建方面的资料很多,但是在搭建过程中发现很多问题教程中并未提及,对初学者不友好。所以博主做了这个系列的文章,从开始搭建环境到对于RKNN Model Zoo的示例进行实践,希望能对初学者有帮助。坚持…...
qt使用笔记二:main.cpp详解
Qt中main.cpp文件详解 main.cpp是Qt应用程序的入口文件,包含程序的启动逻辑。下面我将详细解析其结构和功能。 基本结构 一个典型的Qt main.cpp 文件结构如下: #include <QApplication> // 或者 QGuiApplication/QCoreApplication #include &…...

VBA进度条ProgressForm1
上一章《VBA如何使用ProgressBar进度条控件》介绍了ProgressBar控件的使用方法,今天我给大家介绍ProgressForm1进度条的使用方法,ProgressForm1是集成ProgressBar控件和Label控件的窗体,可以同时显示进度条和百分比,如下图&#x…...

行为型设计模式之Interpreter(解释器)
行为型设计模式之Interpreter(解释器) 前言: 自己的话理解:自定义一个解释器用来校验参数或数据是否合法。 1)意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解…...

深入解析 CAS 操作
一、CAS 的本质:硬件级别的乐观锁 CAS(Compare-And-Swap,比较并交换) 是一种原子操作指令,用于实现对共享变量的无锁并发修改。它是现代多核处理器支持的底层硬件指令,也是构建高效并发数据结构࿰…...

vue3+TS+eslint9配置
记录eslint升级到9.x的版本之后遇到的坑 在 ESLint 9 中,配置方式发生了变化。Flat Config 格式(eslint.config.js 或 .ts)不再支持 extensions 选项。所以vscode编辑器中的 extensions 需要注释掉,要不然保存的时候不会格式化。…...

【bug】Error: /undefinedfilename in (/tmp/ocrmypdf.io.9xfn1e3b/origin.pdf)
在使用ocrmypdf的时候,需要Ghostscript9.55及以上的版本,但是ubuntu自带为9.50 然后使用ocrmypdf报错了 sudo apt update sudo apt install ghostscript gs --version 9.50 #版本不够安装的版本为9.50不够,因此去官网https://ghostscript.c…...
HarmonyOS5.0——CodeGenie:鸿蒙生态的AI编程革命
CodeGenie:鸿蒙生态的AI编程革命 华为推出的 CodeGenie 是集成于 DevEco Studio 的 AI 辅助编程工具,专为 HarmonyOS 应用开发设计。它通过深度优化 ArkTS 和 C 语言的代码生成能力,显著提升开发效率,降低鸿蒙生…...
【Dv3Admin】系统视图字典管理API文件解析
业务系统中静态数据管理常被忽视,但它直接影响到扩展性与维护效率。字典模块通过集中管理各类基础数据,避免硬编码,使系统具备更高的灵活性和适配能力,成为后台管理平台的重要基础组件。 文章解析 dvadmin/system/views/dictiona…...
免费 SecureCRT8.3下载、安装、注册、使用与设置
参考:SecureCRT 8.3中文 安装教程 - Hope - 博客园...

Redis :String类型
String类型 String是Redis中的字符串,是Redis中最基本的数据类型,直接是按照二进制数据的进行存储 Redis中的所有key都是String类型,但是value是有差别的 常见的命令 set 将String类型的value存储到key中,如果之间有相同的ke…...
两种Https正向代理的实现原理
正向代理 HTTPS 主要有两种方案,分别是基于证书的解密与再加密方案和基于 HTTP CONNECT 隧道的方案,以下是这两种方案的具体信息: 一、基于证书的解密与再加密方案 原理 工作原理:代理服务器拥有自己的证书,客户端需…...

第18节 Node.js Web 模块
什么是 Web 服务器? Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序。 Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL,与客户端的网络浏览器配合。 大多数web服务器都支持服务…...

网络爬虫一课一得
网页爬虫(Web Crawler)是一种自动化程序,通过模拟人类浏览行为,从互联网上抓取、解析和存储网页数据。其核心作用是高效获取并结构化网络信息,为后续分析和应用提供数据基础。以下是其详细作用和用途方向: …...

LeetCode--24.两两交换链表中的结点
解题思路: 1.获取信息: 给了一个链表,要求两两一组地交换位置 限定条件:只能进行结点交换,不能修改结点内部的值 额外条件:结点数在0-100的范围,闭区间 2.分析题目:…...

嵌入式SDK技术EasyRTC音视频实时通话助力即时通信社交/教育等多场景创新应用
一、引言 在数字化时代,即时通信已成为人们生活和工作中不可或缺的部分。音视频功能作为即时通信的核心,能实现更加直观、高效的信息传递。EasyRTC作为一款强大的实时通信框架,具备诸多优势,为即时通信的音视频应用提供了优质解…...

IDEA集成JRebel插件,实现实时热部署
系列文章目录 文章目录 系列文章目录一、JRebel是什么?1.1、对比传统开发流程1.2、JRebel特性以及优势 二、IDEA集成JRebel三、IDEA以JRebel运行报错处理四、IDEA以JRebel运行演示实时热部署 一、JRebel是什么? JRebel 是一款针对 Java 开发的热部署工具…...

1-3 Linux-虚拟机(2025.6.7学习篇- mac版本)
1、VMware Fusion下载 在windows系统中使用的VMwareWorkStation未提供Mac版,Mac系统可以使用VMwareFusionPro FusionPro和WorkstationPro均是VMware公司出品,完全兼容,体验基本是一致的。 下载地址:https://www.vmware.com/cn/pro…...

如何打造一款金融推理工具Financial Reasoning Workflow:WebUI+Ollama+Fin-R1+MCP/RAG
在之前的文章中,我探讨了如何使用具身人工智能,让大语言模型智能体来模仿[当今著名对冲基金经理的投资策略]。 在本文中,我将探讨另一种方法,该方法结合了经过金融推理训练的特定大语言模型(LLM)࿰…...
mybatis的if判断==‘1‘不生效,改成‘1‘.toString()才生效的原因
mybatis的xml文件中的if判断‘1’不生效,改成’1’.toString()才生效 Mapper接口传入的参数 List<Table> queryList(Param("state") String state);xml内容 <where><if test"state ! null and state 1">AND EXISTS(select…...

【试卷篇】Spring面试试卷题
一、选择题 1. 下面关于AOP的说法错误的是( C)。 A.AOP将散落在系统中的“方面”代码集中实现 B.AOP有助于提高系统的可维护性 C.AOP已经表现出了将要替代面向对象的趋势 D.AOP是一种设计模式,…...

通过阿里云 DashScope API 调用通义千问
获取API Key 百炼控制台https://bailian.console.aliyun.com/?tabmodel#/api-key 步骤 1:安装 DashScope SDK pip install dashscope 步骤 2:LangChain 调用 from langchain_community.llms import Tongyi# 设置阿里云 API Key(从环境变…...
Go 中 map 的双值检测写法详解
Go 中 map 的双值检测写法详解 在 Go 中,if char, exists : pairs[s[i]]; exists { 是一种利用 Go 语言特性编写的优雅条件语句,用于检测 map 中是否存在某个键。让我们分解解释这种写法: 语法结构解析 if value, ok : mapVariable[key]; …...

大故障:阿里云核心域名爆炸了
大故障:阿里云核心域名被拖走了 今天早上许多群里出现网站故障的讨论,比如 cnblogs 全国访问一片红,一看原来是阿里云又出故障了。 今天早上许多群里出现网站故障的讨论,比如 cnblogs 全国访问一片红,一看原来是阿里云…...

解决Zotero翻译插件Zotero PDF Translate无法正常翻译
试了很多方法了,不管怎么样还是报错,找到最简单的解决办法,把翻译引擎改成CNJI学术翻译就可以了。 不能用的原因是google 翻译API 无法调用。...

【Latex】Windows/Ubuntu 绘制 eps 矢量图通用方法(drawio),支持插入 Latex 数学公式
一直感觉 Visio 或者 PPT 中 Mathtype 对 latex 公式渲染效果不好,且在 Ubuntu 下的支持不好,最近重新调研发现一个好用的工具 drawio。 在线使用 https://app.diagrams.net/?srcabout 也有桌面版的应用,Windows 就下载 exe 安装器&#x…...
Vue---vue使用AOS(滚动动画)库
AOS介绍 aos.js是一个轻量级的动画库插件,可以简单的实现页面滚动触发动画效果,可以让我们网页看起来更加生动(高大上) 官网演示地址:aos.js 安装 YARN, NPM, BOWER安装 yarn add aos npm install aos --save bower install aos --save CDN引入 <link href"https…...
十(1). 强制类型转换
继第十部分C强制类型转换的四种方式,再进行强化巩固一下知识点 static_cast 最常用的,在指针之间做转换 const_cast 去除常量属性 dynamic_cast 用在基类和派生类之间的转换 reinterpret_cast 在任意类型之间进行转 10.1 static_cast 常见的使用场景&am…...
从npm库 Vue 组件到独立SDK:打包与 CDN 引入的最佳实践
文章目录 前言一、 原始方案:直接发布 npm 组件二、升级为独立 SDK:支持 CDN 引入三、核心要点总结1. 独立 Vue 实例2. 动态渲染组件3. 手动挂载到 DOM4. 与用户环境的关系 前言 近期在项目中引入了一个支持多格式(PDF、Video、Word等&#…...