Spring Boot 文件上传和下载指南:从基础到进阶

文章目录

      • 引言
      • 1. 环境配置
      • 2. 文件上传
        • 2.1 配置文件上传路径
        • 2.2 创建上传服务
        • 2.3 创建上传控制器
      • 3. 文件下载
        • 3.1 创建下载服务
        • 3.2 创建下载控制器
      • 4. 前端页面
        • 4.1 文件上传页面
        • 4.2 文件下载页面
      • 5. 技术分析
      • 结论

在这里插入图片描述

🎉欢迎来到SpringBoot框架学习专栏~


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:SpringBoot
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

引言

在现代Web应用程序中,文件上传和下载是非常常见的功能。无论是用户上传头像、上传文档还是下载报告,都需要一个高效、安全的文件处理系统。Spring Boot 作为一个流行的Java框架,为开发者提供了简便的方式来实现这些功能。在这篇文章中,我们将探讨如何在Spring Boot应用中实现文件的上传和下载,并包含详细的代码解析和技术分析。

在这里插入图片描述

1. 环境配置

在开始编码之前,我们需要配置Spring Boot项目。假设你已经创建了一个Spring Boot项目,以下是需要添加的依赖项:

<dependencies><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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
</dependencies>

2. 文件上传

2.1 配置文件上传路径

首先,我们需要配置文件上传的存储路径。在application.properties中添加以下配置:

file.upload-dir=uploads
2.2 创建上传服务

创建一个服务类来处理文件的存储逻辑。我们将使用Spring的MultipartFile接口来处理上传的文件。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;@Service
public class FileStorageService {@Value("${file.upload-dir}")private String uploadDir;public String storeFile(MultipartFile file) throws IOException {// 生成唯一文件名String fileName = UUID.randomUUID().toString() + "_" + file.getOriginalFilename();Path targetLocation = Paths.get(uploadDir).resolve(fileName);// 创建目录Files.createDirectories(targetLocation.getParent());// 保存文件Files.copy(file.getInputStream(), targetLocation);return fileName;}
}
2.3 创建上传控制器

接下来,创建一个控制器来处理文件上传请求。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;@RestController
@RequestMapping("/api/files")
public class FileUploadController {@Autowiredprivate FileStorageService fileStorageService;@PostMapping("/upload")public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {try {String fileName = fileStorageService.storeFile(file);return ResponseEntity.ok("文件上传成功: " + fileName);} catch (IOException e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件上传失败: " + e.getMessage());}}
}

3. 文件下载

3.1 创建下载服务

同样地,我们需要创建一个服务类来处理文件的下载逻辑。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;@Service
public class FileDownloadService {@Value("${file.upload-dir}")private String uploadDir;public Resource loadFileAsResource(String fileName) throws IOException {Path filePath = Paths.get(uploadDir).resolve(fileName).normalize();Resource resource = new UrlResource(filePath.toUri());if (resource.exists() || resource.isReadable()) {return resource;} else {throw new IOException("文件未找到或不可读: " + fileName);}}
}
3.2 创建下载控制器

然后,创建一个控制器来处理文件下载请求。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api/files")
public class FileDownloadController {@Autowiredprivate FileDownloadService fileDownloadService;@GetMapping("/download/{fileName:.+}")public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) {try {Resource resource = fileDownloadService.loadFileAsResource(fileName);return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"").body(resource);} catch (IOException e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);}}
}

4. 前端页面

为了更好地展示文件上传和下载功能,我们可以使用Thymeleaf来创建一个简单的前端页面。

4.1 文件上传页面
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>文件上传</title>
</head>
<body><h1>文件上传</h1><form method="POST" enctype="multipart/form-data" action="/api/files/upload"><input type="file" name="file" /><button type="submit">上传</button></form>
</body>
</html>
4.2 文件下载页面
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>文件下载</title>
</head>
<body><h1>文件下载</h1><form method="GET" action="/api/files/download/{fileName}"><input type="text" name="fileName" placeholder="文件名" /><button type="submit">下载</button></form>
</body>
</html>

5. 技术分析

在这篇文章中,我们实现了Spring Boot中的文件上传和下载功能,涉及到的技术包括:

  • Spring Boot Starter Web:提供了基础的Web开发功能。
  • Spring Boot Starter Thymeleaf:用于前端页面的渲染。
  • Spring Boot Starter Data JPA:如果需要将文件信息存储到数据库中,可以使用该依赖。
  • MultipartFile:Spring提供的用于处理文件上传的接口。
  • Resource:用于文件下载时的资源加载。

这些技术的结合使得我们能够快速、安全地实现文件处理功能。在实际应用中,你可能还需要考虑文件大小限制、文件类型验证、安全性等方面的需求。

结论

通过本文的讲解,相信你已经掌握了在Spring Boot中实现文件上传和下载的基本方法和技术细节。这些功能不仅增强了应用的实用性,也为用户提供了更好的体验。希望你能根据实际项目需求,进一步优化和扩展这些功能。

如果你对本文有任何疑问或建议,欢迎在评论区留言讨论。Happy coding!


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/41062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS多target时怎么对InfoPlist进行国际化

由于不同target要显示不同的App名称、不同的权限提示语&#xff0c;国际化InfoPlist文件必须创建名称为InfoPlist.strings的文件&#xff0c;那么多个target时怎么进行国际化呢&#xff1f;步骤如下&#xff1a; 一、首先我们在项目根目录创建不同的文件夹对应多个不同的targe…

1-2 什么是自然语言处理

1-2 什么是自然语言处理 主目录点这里 自然语言处理是计算机学科、人工智能与语言学领域的一个交叉学科&#xff0c;主要研究如何让计算机能够理解、处理、生成和模拟人类语言的能力&#xff0c;从而实现与人类进行自然语言对话的能力。 如上图&#xff0c;你好通过自然语言处…

笔记:SpringBoot+Vue全栈开发

笔记&#xff1a;SpringBootVue全栈开发 1. 开发环境热部署2. SpringBoot RestController的使用3. SpringBoot实现文件上传4. 配置拦截器5. Restful服务Swagger6. 使用MyBatis-Plus进行数据库操作7. 多表查询、条件查询及分页查询 1. 开发环境热部署 使用spring-boot-devtools…

opencv第一课-cnblog

opencv第一课 创建窗口 import timeimport cv2 #创建窗口 cv2.namedWindow(window,cv2.WINDOW_NORMAL)#cv2.WINDOW_AUTOSIZE自动大小&#xff0c;不允许修改窗口大小#更改窗口的大小 cv2.resizeWindow(window,800,600)#展示名字为window的窗口 cv2.imshow(window,0)key cv2.w…

vue中如何使用echarts和echarts-gl实现三维折线图和三维柱状图

一、vue中使用三维折线图 效果图&#xff1a; 二、使用步骤 1.引入库 安装echarts 在package.json文件中添加 "dependencies": {"echarts": "^5.1.2""echarts-gl": "^1.1.1",// "echarts-gl": "^2.0.8…

『古籍自有答案』古风H5案例赏析

「古籍自有答案」&#xff0c;一部由新京报与字节跳动公益联合打造的古风H5&#xff0c;以诗意盎然的开篇引领用户穿梭于千年文脉。 part1. 创意定位 "人生有惑问先贤&#xff0c;先贤答案存古籍"&#xff0c;在这里&#xff0c;每一个灵魂的探问&#xff0c;都能在…

拥抱 AGI:PieDataCS 引领云原生数据计算系统新范式

自2023年后&#xff0c;人工智能技术进入了一个更为成熟和广泛应用的阶段&#xff0c;人工通用智能&#xff08;AGI&#xff09;这一概念也成为了科技界和产业界热议的焦点。本文将结合 AGI 时代背景&#xff0c;从架构设计到落地实践&#xff0c;详细介绍拓数派云原生数据计算…

中职院校专业群的生成机制研究

摘要&#xff1a; 随着国内产业升级转型步伐的加快和职业教育质量提升的要求&#xff0c;中等职业院校&#xff08;中职院校&#xff09;的专业群建设成为促进教育与产业深度融合、实现内涵式发展的关键。本文采用案例分析法&#xff0c;探讨中职院校专业群生成机制&#xff0c…

Linux手动安装JDK1.8

1、下载要安装的jdk安装包文件 官网下载地址&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/ 2、上传jdk安装包至要安装服务器 3、在要安装jdk位置使用命令解压安装包 安装路径: /usr/local/java 解压安装包&#xff0c;解压命令 tar -zxvf /install…

前端面试项目细节重难点(十)(已工作|做分享)

面试官&#xff1a;现场出需求&#xff1a;我想让一个左侧盒子可以进行拉伸、缩小、展示或隐藏这些功能&#xff0c;你会如何实现&#xff1f; 答&#xff1a;&#xff08;1&#xff09;分析问题&#xff1a;其实&#xff0c;我听到这个问题后&#xff1a; 我的第一种想法&am…

Linux关于文件的高级命令

tree命令 tree命令用于以树状图的形式显示目录结构。它可以帮助用户快速了解目录和文件的层次关系&#xff0c;非常适合用于浏览和理解大型文件系统的结构。 基础用法 显示当前目录的树状结构&#xff1a;tree 显示指定目录的树状结构&#xff1a;tree 指定目录路径 tree命…

基于FreeRTOS+STM32CubeMX+LCD1602+AD5621(SPI接口)的DAC控制输出Proteus仿真

一、仿真原理图: 二、运行效果: 三、STM32CubeMX配置: 1)、GPIO配置: 2)、freertos配置: 四、软件部分: 1)、main主函数: /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file …

模拟5亿年自然进化史,全新蛋白质大模型ESM3诞生!前Meta老将力作LeCun转赞

模拟5亿年自然进化史&#xff0c;全新蛋白质大模型ESM3诞生&#xff01;前Meta老将力作LeCun转赞。 能抗衡AlphaFold 3的生命科学大模型终于出现了。初创公司Evolutionary Scale AI发布了他们最新的98B参数蛋白质语言模型ESM3。不仅支持序列、结构、功能的all-to-all推理&#…

【动态规划】动态规划一

动态规划一 1.第 N 个泰波那契数2.面试题 08.01. 三步问题3.使用最小花费爬楼梯4.解码方法 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.…

[k8s生产系列]:k8s集群故障恢复,etcd数据不一致,kubernetes集群异常

文章目录 摘要1 背景说明2 故障排查2.1 查询docker与kubelet状态2.2 查看kubelet服务日志2.3 重启docker与kubelet服务2.3.1 首先kubelet启动起来了&#xff0c;但是报错master节点找不到2.3.2 查询kubernetes集群服务&#xff0c;发现etcd与kube-apiserver均启动异常 2.4 etcd…

【Pyhton】读取寄存器数据到MySQL数据库

目录 步骤 modsim32软件配置 Navicat for MySQL 代码实现 步骤 安装必要的库&#xff1a;确保安装了pymodbus和pymysql。 配置Modbus连接&#xff1a;设置Modbus从站的IP地址、端口&#xff08;对于TCP&#xff09;或串行通信参数&#xff08;对于RTU&#xff09;。 连接M…

公用对象池

什么是对象池&#xff1f; 对象池顾名思义就是存放对象的池子&#xff0c;主要是为了重复利用对象。将不用的对象扔进池子里&#xff0c;需要用的时候再从池子中取出来。这样的一套机制我们称为对象池。 为什么用对象池&#xff1f; 其实从定义我们就可以看出来&#xff0c;…

算法金 | 我最常用的两个数据可视化软件,强烈推荐

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 抱个拳&#xff0c;送个礼 预警&#xff1a;今天文章的描述可能会让你有点别扭&#xff1b;如感到不适&#xff0c;请及时停止 在我行…

MacOS 安装 mtr 网络检测工具

Install sudo brew install mtr sudo chown root $(which mtr) sudo chmod us $(which mtr) sudo chown root $(which mtr-packet) sudo chmod us $(which mtr-packet) Test mtr google.com

C# WPF 3D 数据孪生 系列六

数字孪生应用开发 应用开发中的布局需求 Grid基本使用 WPF 3D绘图 点云 系列五-CSDN博客 WPF UI 3D 多轴 机械臂 stl 模型UI交互-CSDN博客 WPF UI 3D 基本概念 点线三角面 相机对象 材质对象与贴图 3D地球 光源 变形处理 动作交互 辅助交互插件 系列三-CSDN博客 数字孪生 介…