Spring Boot实现文件上传与OSS集成:从基础到应用
目录
- 前言
- 1. 文件上传的基础实现
- 1.1 前端文件上传请求
- 1.2 后端文件接收与保存
- 2. 集成第三方OSS服务
- 2.1 准备工作
- 2.2 编写OSS集成代码
- 2.3 修改Controller实现文件上传至OSS
- 3. 文件上传的扩展:多文件上传与权限控制
- 结语
前言
随着互联网应用的快速发展,文件上传已成为各类应用的重要功能之一。本文将基于Spring Boot实现文件上传的基础功能,并探讨如何将文件上传服务集成至第三方OSS(如阿里云OSS、华为云OBS等),以提升应用的文件存储能力。我们将以具体的示例代码为切入点,从前端文件上传、后端文件接收与存储、到OSS集成提供详细说明,帮助开发者快速掌握文件上传的开发要点。
1. 文件上传的基础实现
文件上传是现代Web开发中常见的需求。通过MultipartFile
类,Spring Boot支持多种文件类型的接收和处理。在此,我们首先实现文件上传的基础功能,包括前端发送文件、后端接收并存储至本地文件系统。
1.1 前端文件上传请求
前端通过<form>
表单提交文件,并设置enctype
属性为multipart/form-data
。这样可以确保文件以合适的格式传输给服务器。以下是前端表单的示例代码:
<form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file"/><button type="submit">上传文件</button>
</form>
在这里,我们使用POST
方法将文件上传至/upload
路径,并确保数据类型为multipart/form-data
。用户选择文件后,表单将自动将文件数据与表单数据打包并提交给服务器。
1.2 后端文件接收与保存
在后端,使用@RestController
和@PostMapping
注解定义一个/upload
接口,用于接收和处理前端上传的文件。Spring Boot的MultipartFile
类提供了一些方便的方法,如getOriginalFilename()
用于获取原始文件名,transferTo()
用于保存文件。
以下是文件上传的Controller代码:
@RestController
public class FileUploadController {@PostMapping("/upload")public Result<String> upload(MultipartFile file) throws IOException {// 获取原始文件名String originalFilename = file.getOriginalFilename();// 生成唯一文件名,防止文件重名String filename = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));// 将文件存储到本地目录file.transferTo(new File("D:\\temp\\files\\" + filename));// 返回文件访问URL或成功信息return Result.success("文件上传成功,访问路径为:url地址.../" + filename);}
}
在此代码中,我们:
- 获取了原始文件名,并通过UUID生成唯一文件名,避免重名文件的覆盖。
- 使用
file.transferTo()
方法将文件存储到指定目录。 - 返回结果信息,其中可以包含上传文件的访问URL(假设文件已通过Web服务器对外提供访问)。
2. 集成第三方OSS服务
存储文件到本地虽然简单,但在高访问量或大文件场景中,本地存储可能存在扩展性、存储容量、安全性等方面的限制。因此,将文件存储至第三方OSS(如阿里云OSS、华为云OBS等)是一种更为合理的选择。第三方云存储提供稳定的存储服务、CDN加速、权限管理等功能,适合互联网应用。
2.1 准备工作
为了集成OSS服务,我们需要根据官方文档获取相关SDK,并完成账户授权等配置。以下步骤以阿里云OSS为例:
-
引入SDK依赖:在Maven或Gradle配置中添加阿里云OSS SDK的依赖。
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version> </dependency>
-
配置OSS信息:在配置文件
application.yml
或application.properties
中添加OSS的配置信息,包括accessKeyId
、accessKeySecret
、bucketName
和endpoint
。oss:endpoint: http://oss-cn-hangzhou.aliyuncs.comaccessKeyId: yourAccessKeyIdaccessKeySecret: yourAccessKeySecretbucketName: yourBucketName
2.2 编写OSS集成代码
在配置完必要的依赖和参数后,我们创建一个OssService
类,用于封装文件上传至OSS的逻辑:
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import java.io.InputStream;
import java.util.UUID;@Service
public class OssService {@Value("${oss.endpoint}")private String endpoint;@Value("${oss.accessKeyId}")private String accessKeyId;@Value("${oss.accessKeySecret}")private String accessKeySecret;@Value("${oss.bucketName}")private String bucketName;public String uploadFileToOss(InputStream inputStream, String originalFilename) {// 创建OSSClient实例OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {// 生成唯一文件名String filename = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));// 上传文件ossClient.putObject(bucketName, filename, inputStream);// 返回文件的URLreturn "https://" + bucketName + "." + endpoint + "/" + filename;} finally {// 关闭OSSClientossClient.shutdown();}}
}
此类中,我们使用OSSClient
将文件上传至OSS,并生成一个唯一的文件名。uploadFileToOss()
方法返回文件的访问URL,便于后续使用。
2.3 修改Controller实现文件上传至OSS
在FileUploadController
中注入OssService
,并使用其方法上传文件至OSS。以下是修改后的代码:
@RestController
public class FileUploadController {private final OssService ossService;public FileUploadController(OssService ossService) {this.ossService = ossService;}@PostMapping("/upload")public Result<String> upload(MultipartFile file) throws IOException {// 将文件上传至OSS,并获取文件访问URLString url = ossService.uploadFileToOss(file.getInputStream(), file.getOriginalFilename());// 返回OSS的URLreturn Result.success("文件上传成功,访问路径为:" + url);}
}
3. 文件上传的扩展:多文件上传与权限控制
在实际应用中,文件上传可能涉及多文件上传和权限控制等扩展功能。以下是一些典型需求:
- 多文件上传:可以通过在
Controller
中接收MultipartFile[]
数组实现多文件上传,循环处理数组中的每个文件。 - 权限控制:根据OSS服务的权限策略,配置文件访问的公开或私有权限。例如,阿里云OSS允许通过设置Bucket的权限控制公开、私有或指定访问者。
结语
本文介绍了Spring Boot中实现文件上传的基础步骤,包括如何在前端发送文件、后端接收并存储文件。同时,展示了如何将文件存储服务集成至第三方OSS,提升系统的扩展性与安全性。在实际开发中,还可以根据业务需求增加权限控制、多文件处理等功能。希望本文的讲解能够为读者提供清晰的指导,帮助更好地实现文件上传功能。
相关文章:

Spring Boot实现文件上传与OSS集成:从基础到应用
目录 前言1. 文件上传的基础实现1.1 前端文件上传请求1.2 后端文件接收与保存 2. 集成第三方OSS服务2.1 准备工作2.2 编写OSS集成代码2.3 修改Controller实现文件上传至OSS 3. 文件上传的扩展:多文件上传与权限控制结语 前言 随着互联网应用的快速发展,…...

Python学习26天
集合 # 定义集合 num {1, 2, 3, 4, 5} print(f"num:{num}\nnum数据类型为:{type(num)}") # 求集合中元素个数 print(f"num中元素个数为:{len(num)}") # 增加集合中的元素 num.add(6) print(num) # {1,2,3,4,5,6} # 删除…...
linux startup.sh shutdown.sh (kkFileView)
linux启动脚本和关闭脚本startup.sh shutdown.sh (kkFileView) startup.sh DIR_HOME("/opt/openoffice.org3" "/opt/libreoffice" "/opt/libreoffice6.1" "/opt/libreoffice7.0" "/opt/libreoffice7.1&q…...
[MySQL]隐式类型转换
安全等号 <> 如果有参数为NULL,则除了相等比较运算符(),比较的结果为null。对于 nullnull,结果为true。 在select语句中,使用 时,结果不会包含值为 null 的记录,但如果使用安全等号 <> 来…...
面经总结1
文章目录 如何保证批量请求失败,只弹出一个toast1使用计数器:2使用标志变量: 如何减少项目里的if-else1使用多态2使用策略模式3使用字典映射4使用状态模式 babel-runtime 作用是啥如何实现 PDF 预览和下载1浏览器内置PDF阅读器2使用PDF.js库3…...

Oracle19C AWR报告分析之Instance Efficiency Percentages (Target 100%)
Oracle19C AWR报告分析之Instance Efficiency Percentages 一、分析数据二、详细分析2.1 Instance Efficiency Percentages (Target 100%)各项指标及其解释2.2 分析和总结 一、分析数据 二、详细分析 在 Oracle AWR (Automatic Workload Repository) 报告中,每个性能…...

数据结构--数组
一.线性和非线性 线性:除首尾外只有一个唯一的前驱和后继。eg:数组,链表等。 非线性:不是线性的就是非线性。 二.数组是什么? 数组是一个固定长度的存储相同数据类型的数据结构,数组中的元素被存储在一…...
nrm的安装及使用
nrm的安装及使用 NRM(NPM Registry Manager)是一个用于快速切换npm(Node Package Manager)源的工具。npm是Node.js的包管理工具,用于安装、发布、管理Node.js包。由于网络原因,直接使用npm官方源ÿ…...

【MatLab手记】 --从0到了解超超超详过程!!!
文章目录 MatLab笔记一、命令行窗口二、变量命名规则三、数据类型1. 数字2. 字符与字符串3. 矩阵3.1 矩阵创建3.2 矩阵的修改和删除3.3 矩阵的拼接与重构重排3.4 矩阵的运算方法3.5 矩阵的下标 4. 元胞数组(类似数据容器)5. 结构体 四、逻辑与流程控制五…...

从零创建vue+elementui+sass+three.js项目
初始化: vue init webpack projectnamecd projectnamenpm install支持sass: npm install sass --save-dev npm install sass-loader7.1.0 --save-dev npm install node-sass4.12.0 --save-devbuild/webpack.base.conf.js添加 rules: [...,{test: /\.scss$/,loade…...
Linux通过使用scp和sftp发送或拉取文件
在通过 telnet 登录到远程服务器之后,你无法直接使用 telnet 发送文件。telnet 是一个纯文本协议,不支持文件传输。要发送文件,你需要使用其他工具,如 scp 或 sftp。以下是使用这两种工具发送文件的方法: 使用 scp 发…...
Jtti:服务器总是自动重启怎么办?
服务器总是自动重启可能是由于多种原因引起的,包括硬件故障、软件问题、配置错误或环境因素。以下是一些常见原因和相应的解决方案: 1. 硬件问题 电源故障:电源供应不稳定或电源模块故障可能导致服务器重启。 解决方案:检查电源供…...

北京大学c++程序设计听课笔记101
基本概念 程序运行期间,每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址(也称“入口地址”)。我们可以将函数的入口地址赋给一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以调用这个…...

一键生成本地SSL证书:打造HTTPS安全环境
一键生成本地SSL证书:打造HTTPS安全环境 日光下的寒林没有一丝杂质,空气里的冰冷仿佛来自故乡遥远的北国,带着一些相思,还有细微几至不可辨认的骆驼的铃声。–《心美,一切皆美》 在本地开发环境中启用 HTTPS 一直是许多…...

Unity类银河战士恶魔城学习总结(P124 CharacterStats UI玩家的UI)
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了玩家属性栏,仓库,物品栏UI的制作 UI_StatSlot.cs 这个脚本是用来在Unity的UI上显示玩家属性…...
速盾:cdn 支持 php 吗?
在网络开发中,PHP 是一种广泛使用的服务器端脚本语言,用于创建动态网页和 web 应用程序。CDN(Content Delivery Network,内容分发网络)在内容分发方面具有强大的功能,那么它是否支持 PHP 呢? C…...
在linux中使用nload实时查看网卡流量
在Linux系统中,可以使用多种工具来查看网卡流量。以下是一些常用的命令行工具: ifconfig:这是最基本的网络接口查看命令,但在最新的Linux发行版中,ifconfig命令已经被ip命令替代。 ip:用来查看和操作路由…...

【JavaEE进阶】Spring 事务和事务传播机制
目录 1.事务回顾 1.1 什么是事务 1.2 为什么需要事务 1.3 事务的操作 2. Spring 中事务的实现 2.1 Spring 编程式事务(了解) 2.2 Spring声明式事务 Transactional 对比事务提交和回滚的日志 3. Transactional详解 3.1 rollbackFor 3.2 Transactional 注解什么时候会…...

Flink1.19编译并Standalone模式本地运行
1.首先下载源码 2.本地运行 新建local_conf和local_lib文件夹,并且将编译后的文件放入对应的目录 2.1 启动前参数配置 2.1.2 StandaloneSessionClusterEntrypoint启动参数修改 2.1.3 TaskManagerRunner启动参数修改 和StandaloneSessionClusterEntrypoint一样修改…...
gitlab-development-kit部署gitlab《二》
gitlab-development-kit部署gitlab《一》 环境 mac 12.7.4 xcode 14.2 gdk 0.2.16 gitlab-foss 13.7 QA xcode源码安装 # https://crifan.github.io/xcode_dev_summary/website/xcode_dev/install_xcode/ # https://xcodereleases.comopenssl1.1 源码安装 # https://open…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...