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

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为例:

  1. 引入SDK依赖:在Maven或Gradle配置中添加阿里云OSS SDK的依赖。

    <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version>
    </dependency>
    
  2. 配置OSS信息:在配置文件application.ymlapplication.properties中添加OSS的配置信息,包括accessKeyIdaccessKeySecretbucketNameendpoint

    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. 文件上传的扩展&#xff1a;多文件上传与权限控制结语 前言 随着互联网应用的快速发展&#xff0c;…...

Python学习26天

集合 # 定义集合 num {1, 2, 3, 4, 5} print(f"num&#xff1a;{num}\nnum数据类型为&#xff1a;{type(num)}") # 求集合中元素个数 print(f"num中元素个数为&#xff1a;{len(num)}") # 增加集合中的元素 num.add(6) print(num) # {1,2,3,4,5,6} # 删除…...

linux startup.sh shutdown.sh (kkFileView)

linux启动脚本和关闭脚本startup.sh shutdown.sh &#xff08;kkFileView&#xff09; startup.sh DIR_HOME("/opt/openoffice.org3" "/opt/libreoffice" "/opt/libreoffice6.1" "/opt/libreoffice7.0" "/opt/libreoffice7.1&q…...

[MySQL]隐式类型转换

安全等号 <> 如果有参数为NULL&#xff0c;则除了相等比较运算符()&#xff0c;比较的结果为null。对于 nullnull&#xff0c;结果为true。 在select语句中&#xff0c;使用 时&#xff0c;结果不会包含值为 null 的记录&#xff0c;但如果使用安全等号 <> 来…...

面经总结1

文章目录 如何保证批量请求失败&#xff0c;只弹出一个toast1使用计数器&#xff1a;2使用标志变量&#xff1a; 如何减少项目里的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) 报告中&#xff0c;每个性能…...

数据结构--数组

一.线性和非线性 线性&#xff1a;除首尾外只有一个唯一的前驱和后继。eg&#xff1a;数组&#xff0c;链表等。 非线性&#xff1a;不是线性的就是非线性。 二.数组是什么&#xff1f; 数组是一个固定长度的存储相同数据类型的数据结构&#xff0c;数组中的元素被存储在一…...

nrm的安装及使用

nrm的安装及使用 NRM&#xff08;NPM Registry Manager&#xff09;是一个用于快速切换npm&#xff08;Node Package Manager&#xff09;源的工具。npm是Node.js的包管理工具&#xff0c;用于安装、发布、管理Node.js包。由于网络原因&#xff0c;直接使用npm官方源&#xff…...

【MatLab手记】 --从0到了解超超超详过程!!!

文章目录 MatLab笔记一、命令行窗口二、变量命名规则三、数据类型1. 数字2. 字符与字符串3. 矩阵3.1 矩阵创建3.2 矩阵的修改和删除3.3 矩阵的拼接与重构重排3.4 矩阵的运算方法3.5 矩阵的下标 4. 元胞数组&#xff08;类似数据容器&#xff09;5. 结构体 四、逻辑与流程控制五…...

从零创建vue+elementui+sass+three.js项目

初始化&#xff1a; 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 登录到远程服务器之后&#xff0c;你无法直接使用 telnet 发送文件。telnet 是一个纯文本协议&#xff0c;不支持文件传输。要发送文件&#xff0c;你需要使用其他工具&#xff0c;如 scp 或 sftp。以下是使用这两种工具发送文件的方法&#xff1a; 使用 scp 发…...

Jtti:服务器总是自动重启怎么办?

服务器总是自动重启可能是由于多种原因引起的&#xff0c;包括硬件故障、软件问题、配置错误或环境因素。以下是一些常见原因和相应的解决方案&#xff1a; 1. 硬件问题 电源故障&#xff1a;电源供应不稳定或电源模块故障可能导致服务器重启。 解决方案&#xff1a;检查电源供…...

北京大学c++程序设计听课笔记101

基本概念 程序运行期间&#xff0c;每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址&#xff08;也称“入口地址”&#xff09;。我们可以将函数的入口地址赋给一个指针变量&#xff0c;使该指针变量指向该函数。然后通过指针变量就可以调用这个…...

一键生成本地SSL证书:打造HTTPS安全环境

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

Unity类银河战士恶魔城学习总结(P124 CharacterStats UI玩家的UI)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了玩家属性栏&#xff0c;仓库&#xff0c;物品栏UI的制作 UI_StatSlot.cs 这个脚本是用来在Unity的UI上显示玩家属性&#xf…...

速盾:cdn 支持 php 吗?

在网络开发中&#xff0c;PHP 是一种广泛使用的服务器端脚本语言&#xff0c;用于创建动态网页和 web 应用程序。CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;在内容分发方面具有强大的功能&#xff0c;那么它是否支持 PHP 呢&#xff1f; C…...

在linux中使用nload实时查看网卡流量

在Linux系统中&#xff0c;可以使用多种工具来查看网卡流量。以下是一些常用的命令行工具&#xff1a; ifconfig&#xff1a;这是最基本的网络接口查看命令&#xff0c;但在最新的Linux发行版中&#xff0c;ifconfig命令已经被ip命令替代。 ip&#xff1a;用来查看和操作路由…...

【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文件夹&#xff0c;并且将编译后的文件放入对应的目录 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…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...