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

使用 Spring Boot 实现文件上传:从配置文件中动态读取上传路径

使用 Spring Boot 实现文件上传:从配置文件中动态读取上传路径

      • 一、前言
      • 二、文件上传的基本概念
      • 三、环境准备
        • 1. 引入依赖
        • 2. 配置文件设置
          • `application.yml` 配置示例:
          • `application.properties` 配置示例:
      • 四、编写文件上传功能代码
        • 1. 控制器类
        • 2. 代码解析
        • 3. 配置实体类与服务层操作(可选)
      • 五、异常处理与文件上传安全
      • 六、小结


一、前言

在现代 Web 开发中,文件上传是一个常见的需求。Spring Boot 提供了强大的文件上传支持,但如何动态地根据配置文件来读取上传路径,并保证上传的安全性与灵活性呢?在本文中,我们将通过一个实际示例,详细介绍如何在 Spring Boot 中实现文件上传,且上传路径可从配置文件中读取。

二、文件上传的基本概念

文件上传指的是用户将文件通过 HTTP 请求上传到服务器的过程。通常,文件上传的功能包括:

  • 接收客户端发送的文件数据。
  • 保存上传的文件到服务器的指定目录。
  • 返回操作结果(如上传成功或失败)。

在 Java 中,Spring Boot 提供了 MultipartFile 类型来处理文件上传,常配合 @RequestParam 注解使用。

三、环境准备

在开始代码之前,我们先进行一些必要的环境准备工作。

1. 引入依赖

首先,我们需要在 Spring Boot 项目中引入相关依赖。通常,文件上传功能的实现需要 spring-boot-starter-webspring-boot-starter-thymeleaf(如果你使用 Thymeleaf 模板渲染)等基础组件。确保在 pom.xml 中包含以下依赖:

<dependencies><!-- Spring Boot Web Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 文件上传支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- Spring Boot DevTools (可选, 用于开发时热重载) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope></dependency>
</dependencies>
2. 配置文件设置

在 Spring Boot 中,配置文件(如 application.ymlapplication.properties)是管理应用程序配置的标准方式。我们需要在配置文件中设置上传文件的目录路径,以便从配置中动态读取。

application.ymlapplication.properties 中设置文件上传目录:

application.yml 配置示例:
file:upload-dir: C:/serve/upload
application.properties 配置示例:
file.upload-dir=C:/serve/upload

通过这些配置,我们可以在应用程序中读取文件上传目录,而不需要硬编码路径,增强了程序的灵活性。

四、编写文件上传功能代码

1. 控制器类

在 Spring Boot 中,我们通过 @RestController@Controller 注解来创建控制器类。在文件上传的实现中,我们需要处理 MultipartFile 类型的参数,并将文件保存到指定目录。以下是一个文件上传的控制器实现示例:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Date;@RestController
public class FileUploadController {// 从配置文件中读取文件上传目录路径@Value("${file.upload-dir}")private String uploadDir;/*** 上传文件*/@RequestMapping(value = "/upload", method = RequestMethod.POST)public R upload(@RequestParam("file") MultipartFile file, String type, HttpServletRequest request) throws Exception {// 检查文件是否为空if (file.isEmpty()) {throw new EIException("上传文件不能为空");}// 获取文件扩展名String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);// 生成文件名:当前时间戳 + 文件扩展名String fileName = new Date().getTime() + "." + fileExt;// 获取配置文件中的上传目录路径,并确保目录存在File uploadDirFile = new File(uploadDir);if (!uploadDirFile.exists()) {uploadDirFile.mkdirs();  // 创建目录}// 创建目标文件File dest = new File(uploadDirFile, fileName);// 将文件保存到目标路径file.transferTo(dest);// 如果上传的类型是 "1",则更新配置项 "faceFile"if (StringUtils.hasText(type) && "1".equals(type)) {ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));if (configEntity == null) {configEntity = new ConfigEntity();configEntity.setName("faceFile");configEntity.setValue(fileName);} else {configEntity.setValue(fileName);}configService.insertOrUpdate(configEntity);}// 返回成功的响应,包含文件名return R.ok().put("file", fileName);}
}
2. 代码解析
  • 读取配置文件路径:通过 @Value("${file.upload-dir}") 注解,我们可以将配置文件中的 file.upload-dir 属性注入到 uploadDir 变量中。这使得我们能够动态读取文件上传路径,而不需要在代码中硬编码路径。
  • 检查文件是否为空:在上传文件前,先检查文件是否为空,防止空文件上传。
  • 生成文件名:为了避免文件名重复,我们通过当前的时间戳来生成唯一的文件名。
  • 创建目录:在保存文件之前,检查指定的上传目录是否存在。如果目录不存在,我们会自动创建它。
  • 保存文件:通过 file.transferTo(dest) 将文件保存到服务器指定路径。
  • 返回响应:文件上传成功后,返回一个包含文件名的响应。
3. 配置实体类与服务层操作(可选)

在上传过程中,我们可能需要在数据库中保存一些文件信息,例如用户头像等。如果需要将文件信息保存到数据库中,我们可以定义一个 ConfigEntity 类,并通过 configService 操作数据库。

五、异常处理与文件上传安全

在文件上传过程中,我们应当注意以下几点安全问题:

  • 文件大小限制:应限制上传文件的大小,防止过大的文件消耗过多的服务器资源。Spring Boot 提供了相关配置项,如 spring.servlet.multipart.max-file-sizespring.servlet.multipart.max-request-size,可以设置上传文件的最大尺寸。

    spring:servlet:multipart:max-file-size: 10MBmax-request-size: 10MB
    
  • 文件类型限制:为了防止恶意文件上传,我们可以根据文件扩展名或 MIME 类型限制上传文件的类型。

  • 异常处理:为了提高代码的健壮性,我们可以通过 @ControllerAdvice@ExceptionHandler 统一处理文件上传中的异常,返回友好的错误信息。

六、小结

在这篇文章中,我们学习了如何在 Spring Boot 项目中实现文件上传,并从配置文件中动态读取上传路径。通过使用 Spring Boot 的 MultipartFile 和配置注入,我们可以灵活地管理文件上传功能,同时增强程序的可维护性与安全性。

相关文章:

使用 Spring Boot 实现文件上传:从配置文件中动态读取上传路径

使用 Spring Boot 实现文件上传&#xff1a;从配置文件中动态读取上传路径 一、前言二、文件上传的基本概念三、环境准备1. 引入依赖2. 配置文件设置application.yml 配置示例&#xff1a;application.properties 配置示例&#xff1a; 四、编写文件上传功能代码1. 控制器类2. …...

《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS技术理念

1.2 技术理念 在万物智联时代重要机遇期&#xff0c;HarmonyOS结合移动生态发展的趋势&#xff0c;提出了三大技术理念&#xff08;如下图3-1所示&#xff09;&#xff1a;一次开发&#xff0c;多端部署&#xff1b;可分可合&#xff0c;自由流转&#xff1b;统一生态&#xf…...

将多个 k8s yaml 配置文件合并为一个文件

如下bash脚本实现功能 “将多个k8s的yaml 配置文件” 合并为一个 yaml&#xff0c;使用 --- 分割文件配置。 创建文件 merge_yaml.sh &#xff0c;内容如下&#xff1a; #!/bin/bash# 默认参数 input_patterns() # 匹配的文件模式数组 output_file"combined.yaml"…...

Linux 文件的特殊权限—Sticky Bit(SBIT)权限

本文为Ubuntu Linux操作系统- 第十九期~~ 其他特殊权限: 【SUID 权限】和【SGID 权限】 更多Linux 相关内容请点击&#x1f449;【Linux专栏】~ 主页&#xff1a;【练小杰的CSDN】 文章目录 Sticky&#xff08;SBIT&#xff09;权限基本概念Sticky Bit 的表示方式举例 设置和取…...

MIPI D-PHY/C-PHY/M-PHY 高速串行接口标准

MIPI D-PHY、C-PHY和M-PHY都是MIPI联盟制定的高速串行接口标准。它们都具有低功耗、高速传输速率等特点&#xff0c;但各有侧重&#xff1a; ➢MIPI D-PHY&#xff1a;适用于手机与其他设备之间的数据传输。 ➢MIPI C-PHY&#xff1a;专为手机摄像头而设计。 ➢MIPI M-PHY&am…...

USB免驱IC读写器QT小程序开发

USB免驱全协议IC卡读写器QT小程序开发&#xff0c;读取15693卡。 QT小程序UI开发界面&#xff1a; QT程序代码mainWindow.cpp代码如下&#xff1a; MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this); }MainWind…...

OSCP靶场训练冒险之kioprix4:shell逃逸以及利用数据库提权

声明&#xff01; 学习资源来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

NIPS2014 | GAN: 生成对抗网络

Generative Adversarial Nets 摘要-Abstract引言-Introduction相关工作-Related Work对抗网络-Adversarial Nets理论结果-Theoretical Results实验-Experiments优势和不足-Advantages and disadvantages缺点优点 结论及未来工作-Conclusions and future work研究总结未来研究方…...

Postman接口测试01|接口测试基础概念、http协议、RESTful风格、接口文档

目录 一、接口测试基础概念 1、什么是接口 2、接口的类型 3、什么是接口测试 4、为什么要做接口测试 5、接口测试的实现方式 6、什么是自动化接口测试&#xff1f; 二、接口返回的数据格式 1、三种格式 2、Json 三、接口协议 1、webservice协议 2、dubbo协议 3、…...

Linux系统编程——详解页表

目录 一、前言 二、深入理解页表 三、页表的实际组成 四、总结&#xff1a; 一、前言 页表是我们之前在讲到程序地址空间的时候说到的&#xff0c;它是物理内存到进程程序地址空间的一个桥梁&#xff0c;通过它物理内存的数据和代码才能映射到进程的程序地址空间中&#xff…...

SpringBoot + HttpSession 自定义生成sessionId

SpringBoot HttpSession 自定义生成sessionId 业务场景实现方案 业务场景 最近在做用户登录过程中&#xff0c;由于默认ID是通过UUID创建的&#xff0c;缺乏足够的安全性&#xff0c;决定要自定义生成 sessionId。 实现方案 正常的获取session方法如下&#xff1a; HttpSe…...

循环对称复高斯分布(Circularly Symmetric Complex Gaussian Distribution)

一、引言 循环对称复高斯分布&#xff08;Circularly Symmetric Complex Gaussian Distribution&#xff0c;简称CSCG&#xff09;在无线通信、信号处理等领域具有广泛的应用。作为一种特殊的复高斯分布&#xff0c;CSCG具有独特的性质&#xff0c;如循环对称性、高斯性等&…...

xinput1_3.dll放在哪里?当xinput1_3.dll丢失时的应对策略:详细解决方法汇总

在计算机系统的运行过程中&#xff0c;我们偶尔会遇到一些令人困扰的问题&#xff0c;其中xinput1_3.dll文件丢失就是较为常见的一种情况。这个看似不起眼的动态链接库文件&#xff0c;实则在许多软件和游戏的正常运行中发挥着至关重要的作用。一旦它丢失&#xff0c;可能会导致…...

基于STM32的智能家居环境监控系统设计

目录 引言系统设计 硬件设计软件设计系统功能模块 环境监控模块控制模块显示模块系统实现 硬件实现软件实现系统调试与优化结论与展望 1. 引言 随着智能家居技术的发展&#xff0c;环境监控系统已经成为家居管理的重要组成部分。智能家居环境监控系统通过实时监测室内温度、湿…...

Vscode + gdbserver远程调试开发板指南:

本章目录 步骤环境准备网络配置vscode配置步骤 (全图示例)开发板配置开始调试注意: 每次断开之后&#xff0c;开发板都需要重新启动gdbserver才可调试。 参考链接: 步骤 环境准备 将交叉编译链路径加入$PATH变量&#xff1a;确保系统能够找到所需的工具。 export PATH$PATH:/p…...

大表:适用于结构化数据的分布式存储系统

大家觉得有意义和帮助记得及时关注和点赞!!! 译者序摘要1 引言2 数据模型 2.1 行&#xff08;Row&#xff09;2.2 Column Families&#xff08;列族&#xff09; 2.2.1 设计2.2.2 column key 的格式&#xff1a;family:qualifier2.2.3 访问控制和磁盘/内存记账&#xff08;acco…...

深入解析MVCC中Undo Log版本底层存储读取逻辑

一、引言 多版本并发控制&#xff08;MVCC&#xff0c;Multi-Version Concurrency Control&#xff09;是一种广泛应用于关系数据库管理系统中的并发控制技术。它通过保存数据的历史版本&#xff0c;使得在事务并发执行时&#xff0c;每个事务都能看到数据的一致性视图。在MVC…...

游戏引擎学习第64天

代码改的我看的比较懵 原视频可以去这个网站去看 https://guide.handmadehero.org/ 回顾我们在模拟区域方面的进展 在目前的情况下&#xff0c;如果有很多任务需要完成&#xff0c;可以进行分解。在昨天收到的改变中&#xff0c;决定将任务分解成模拟区域。模拟区域是可以随时…...

Effective C++ 条款33:避免遮掩继承而来的名称

文章目录 条款33&#xff1a;避免遮掩继承而来的名称为什么避免遮掩&#xff1f;如何避免遮掩&#xff1f;1. 使用 using 声明式2. 使用转交函数 (Forwarding Functions) 总结 条款33&#xff1a;避免遮掩继承而来的名称 在 C 中&#xff0c;派生类&#xff08;derived class&…...

UEFI Spec 学习笔记---4 - EFI System Table(1)

4 - EFI System Table 本章节主要介绍的是 UEFI Image 的 Entry point&#xff08;在 UEFI 固件执行的时候&#xff0c;都是直接调用入口函数并且执行从而调用其他的 driver&#xff09;。 UEFI Image 主要是有三类&#xff1a;UEFI boot service driver、UEFI runtime drive…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)

目录 &#x1f50d; 若用递归计算每一项&#xff0c;会发生什么&#xff1f; Horners Rule&#xff08;霍纳法则&#xff09; 第一步&#xff1a;我们从最原始的泰勒公式出发 第二步&#xff1a;从形式上重新观察展开式 &#x1f31f; 第三步&#xff1a;引出霍纳法则&…...