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

Spring Boot集成阿里云OSS:对象存储实战指南


Spring Boot集成阿里云OSS:对象存储实战指南


1. OSS是什么?为什么选择阿里云OSS?

对象存储(OSS) 是一种用于存储非结构化数据(如图片、视频、日志文件)的云服务,核心功能包括:

  • 海量存储:支持无限容量扩展。
  • 高可用性:数据自动冗余备份,保障99.999999999%(11个9)的持久性。
  • 低成本:按实际使用量付费,无前期硬件投入。

阿里云OSS的优势

  • 全球覆盖:支持多地域存储(如北京、新加坡、法兰克福)。
  • 安全合规:提供HTTPS传输、权限控制、日志审计等功能。
  • 生态集成:无缝对接CDN、图片处理、视频点播等服务。

典型应用场景

  • 用户头像、商品图片存储
  • 企业文件共享与备份
  • 视频网站资源托管

2. 环境准备

2.1 注册阿里云并开通OSS

  1. 访问阿里云官网注册账号。
  2. 进入 OSS控制台 → 开通服务(首次使用需实名认证)。

2.2 创建Bucket

  1. 点击 创建Bucket → 填写名称(全局唯一,如myapp-images)。
  2. 地域选择:根据用户分布选择(如华东1)。
  3. 权限设置:默认私有(推荐)或公共读(需谨慎)。

2.3 获取AccessKey

  1. 鼠标悬停右上角头像 → AccessKey管理 → 创建AccessKey。
  2. 保存 AccessKey IDAccessKey Secret(仅显示一次)。

3. Spring Boot项目初始化

3.1 创建项目
使用 Spring Initializr 生成项目,勾选:

  • Spring Web

3.2 添加依赖

<!-- Maven -->
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.16.1</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

3.3 配置参数

# application.properties
# OSS配置
aliyun.oss.endpoint=oss-cn-beijing.aliyuncs.com
aliyun.oss.accessKeyId=your-access-key-id
aliyun.oss.accessKeySecret=your-access-key-secret
aliyun.oss.bucketName=myapp-images

4. OSS核心功能实现

4.1 封装OSS工具类

@Configuration
public class OssConfig {@Value("${aliyun.oss.endpoint}")private String endpoint;@Value("${aliyun.oss.accessKeyId}")private String accessKeyId;@Value("${aliyun.oss.accessKeySecret}")private String accessKeySecret;@Value("${aliyun.oss.bucketName}")private String bucketName;@Beanpublic OSS ossClient() {return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);}
}@Service
public class OssService {@Autowiredprivate OSS ossClient;@Autowiredprivate String bucketName;// 上传文件public String uploadFile(MultipartFile file, String path) throws IOException {String fileName = path + "/" + UUID.randomUUID() + "-" + file.getOriginalFilename();ossClient.putObject(bucketName, fileName, new ByteArrayInputStream(file.getBytes()));return fileName;}// 生成文件访问URL(私有Bucket需签名)public String getFileUrl(String fileName) {return "https://" + bucketName + "." + endpoint + "/" + fileName;}// 删除文件public void deleteFile(String fileName) {ossClient.deleteObject(bucketName, fileName);}
}

4.2 文件上传接口

@RestController
@RequestMapping("/api/oss")
public class OssController {@Autowiredprivate OssService ossService;@PostMapping("/upload")public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) {try {String fileName = ossService.uploadFile(file, "avatars");return ResponseEntity.ok(ossService.getFileUrl(fileName));} catch (IOException e) {return ResponseEntity.status(500).body("上传失败");}}
}

4.3 前端上传示例(Axios)

// 前端代码
const fileInput = document.getElementById('file-input');
const formData = new FormData();
formData.append('file', fileInput.files[0]);axios.post('/api/oss/upload', formData, {headers: { 'Content-Type': 'multipart/form-data' }
}).then(response => {console.log('文件访问地址:', response.data);
});

5. 高级功能

5.1 分块上传(适合大文件)

public String uploadBigFile(File file, String path) {String fileName = path + "/" + file.getName();InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, fileName);InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request);String uploadId = result.getUploadId();// 分块上传逻辑(略)// ...ossClient.completeMultipartUpload(new CompleteMultipartUploadRequest(bucketName, fileName, uploadId, partETags));return fileName;
}

5.2 图片处理(生成缩略图)

public String getThumbnailUrl(String fileName) {String style = "image/resize,w_100"; // 缩放到宽度100pxreturn getFileUrl(fileName) + "?x-oss-process=" + style;
}

6. 权限控制与安全

6.1 STS临时凭证

// 生成临时Token(需配置RAM角色)
public STSAssumeRoleSessionCredentials getSTSCredentials() {STSAssumeRoleSessionCredentials credentials = new STSAssumeRoleSessionCredentials("your-access-key-id","your-access-key-secret","your-role-arn","session-name");return credentials;
}

6.2 HTTPS强制加密
在Bucket配置中开启 强制HTTPS访问

  1. 进入OSS控制台 → Bucket → 传输管理安全策略 → 开启HTTPS。

7. 与Spring Boot深度集成

7.1 自动配置优化

@Configuration
@EnableConfigurationProperties(OssProperties.class) // 自定义属性类
public class OssAutoConfig {// 自动注入OSSClient
}

7.2 结合Spring Security控制上传权限

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/api/oss/upload").hasRole("ADMIN").anyRequest().permitAll();}
}

8. 常见问题与解决方案

问题1:AccessKey无效

  • 排查步骤
    1. 检查AccessKey是否过期或被禁用。
    2. 验证Bucket权限策略是否允许当前AccessKey操作。

问题2:上传超时

  • 解决方案
    // 配置OSSClient超时参数
    ClientBuilderConfiguration config = new ClientBuilderConfiguration();
    config.setConnectionTimeout(30 * 1000); // 30秒
    OSS client = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, config);
    

问题3:文件无法下载

  • 可能原因
    • Bucket为私有权限但未生成签名URL。
    • 文件路径包含非法字符(如空格)。

9. 总结与扩展学习

应用场景

  • 电商平台商品图片管理
  • 企业文档云存储
  • 移动App用户内容托管

扩展学习

  • 阿里云OSS官方文档
  • OSS与CDN加速集成指南
  • MinIO自建对象存储对比

流程图:文件上传流程

Client SpringBoot OSS 发送文件上传请求 调用SDK上传文件 返回上传结果 返回文件访问URL Client SpringBoot OSS

避坑指南

  1. AccessKey安全:通过环境变量或配置中心管理密钥,禁止写入代码。
  2. Bucket命名:全局唯一且仅包含小写字母、数字、短横线。
  3. 地域选择:选择靠近用户群体的地域以减少延迟。

立即行动

  • 访问阿里云OSS控制台创建第一个Bucket!
  • 下载示例代码快速集成。

让阿里云OSS为您的应用提供稳定高效的对象存储服务! 🚀

相关文章:

Spring Boot集成阿里云OSS:对象存储实战指南

Spring Boot集成阿里云OSS&#xff1a;对象存储实战指南 1. OSS是什么&#xff1f;为什么选择阿里云OSS&#xff1f; 对象存储&#xff08;OSS&#xff09; 是一种用于存储非结构化数据&#xff08;如图片、视频、日志文件&#xff09;的云服务&#xff0c;核心功能包括&#…...

【力扣hot100题】(019)旋转图像

比较考验脑子转不转得过来&#xff0c;最好先在纸上画一下图整理思路&#xff0c;不要和我一样上来就无脑套循环。 理解了思路还是好做的&#xff0c;每个小循环转一圈&#xff0c;大循环代表转的第几圈。小循环循环n-2i-1次&#xff0c;大循环循环&#xff08;n1&#xff09;…...

06_约束

文章目录 一、是什么二、实体完整性约束2.1、主键约束2.2、主键自增长2.3、唯一约束 三、域完整性约束3.1、非空约束3.2、默认值 四、引用完整性约束 一、是什么 用于限制加入表的数据的类型和规范&#xff0c;约束是添加在列上的&#xff0c;用来约束列的。 分类&#xff1a; …...

Anolis OS 8.4修复CVE-1999-0554漏洞记录

1. 使用TCP Wrappers配置白名单 通过修改/etc/hosts.allow和/etc/hosts.deny文件&#xff0c;仅允许特定IP访问NFS的mountd服务&#xff08;需确保系统支持TCP Wrappers&#xff09;&#xff1a; 编辑/etc/hosts.allow&#xff0c;添加允许的客户端IP&#xff08;如192.168.1…...

Seata AT模式的一些常见问题及其源码解析

Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 Seata AT 基于两阶段提交协议的演变&#xff1a; 一阶段&#xff1a;业…...

华为GaussDB数据库的手动备份与还原操作介绍

数据库的备份以A机上的操作为例。 1、使用linux的root用户登录到GaussDB服务器。 2、用以下命令切换到 GaussDB 管理员用户&#xff0c;其中&#xff0c;omm 为当前数据库的linux账号。 su - omm 3、执行gs_dump命令进行数据库备份&#xff1a; 这里使用gs_dump命令进行备…...

2025年3月29日(matlab -ss -lti)

线性时不变系统&#xff08;LTI系统&#xff09;的定义与核心特性 线性时不变系统&#xff08;Linear Time-Invariant System&#xff09;是信号与系统分析中的基础模型&#xff0c;其核心特性包括线性和时不变性。以下从定义、验证方法和应用场景展开说明&#xff1a; 1. 线性…...

网络原理-TCP/IP

网络原理学习笔记&#xff1a;TCP/IP 核心概念 本文是我在学习网络原理时整理的笔记&#xff0c;主要涵盖传输层、网络层和数据链路层的核心协议和概念&#xff0c;特别是 TCP, UDP, IP, 和以太网。 一、传输层 (Transport Layer) 传输层负责提供端到端&#xff08;进程到进…...

服务器磁盘卷组缓存cache设置介绍

工具1&#xff1a; storcli a. 确认软件包是否安装 [rootlocalhost ~]#rpm -qa | grep storcli storcli-1.21.06-1.noarch 备注&#xff1a;若检索结果为空&#xff0c;需要安装对应的软件安装包。安装命令如下&#xff1a; #rpm -ivh storcli-xx-xx-1.noarch.rpm b. 查看逻辑…...

Unity顶点优化:UV Splits与Smoothing Splits消除技巧

一、顶点分裂问题概述 1. 什么是顶点分裂 顶点分裂(Vertex Splits)是3D渲染中常见的性能问题&#xff0c;当模型需要为同一顶点位置存储不同属性值时&#xff0c;会创建多个顶点副本。主要分为两类&#xff1a; UV Splits&#xff1a;由UV不连续引起 Smoothing Splits&#…...

第五十三章 Spring之假如让你来写Boot——环境篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…...

Router [Continuation Settings]

楼上网络CMCC-Wmew&#xff0c;楼下接收不到&#xff0c;可能因为喜好弱&#xff0c;再弄一台路由器中转一下 Router [Continuation Settings] 路由器中续设置 到这里这台K3的路由器设置完成了&#xff0c;作为转发&#xff0c;中续&#xff0c;她还需要设置上游路由器&#…...

Zookeeper中的Zxid是如何设计的

想获取更多高质量的Java技术文章&#xff1f;欢迎访问Java技术小馆官网&#xff0c;持续更新优质内容&#xff0c;助力技术成长 Java技术小馆官网https://www.yuque.com/jtostring Zookeeper中的Zxid是如何设计的 如果你们之前学习过 ZooKeeper&#xff0c;你们可能已经了解…...

蓝桥云客 岛屿个数

0岛屿个数 - 蓝桥云课 问题描述 小蓝得到了一副大小为 MN 的格子地图&#xff0c;可以将其视作一个只包含字符 0&#xff08;代表海水&#xff09;和 1&#xff08;代表陆地&#xff09;的二维数组&#xff0c;地图之外可以视作全部是海水&#xff0c;每个岛屿由在上/下/左/右…...

深度学习篇---paddleocr正则化提取

文章目录 前言一、代码总述&介绍1.1导入必要的库1.1.1cv21.1.2re1.1.3paddleocr 1.2初始化PaddleOCR1.3打开摄像头1.4使用 PaddleOCR 进行识别1.5定义正则表达式模式1.6打印提取结果1.7异常处理 二、正则表达式2.1简介2.2常用正则表达式模式及原理2.2.1. 快递单号模式2.2.2…...

Android 蓝牙/Wi-Fi通信协议之:低功耗蓝牙(BLE 4.0+)介绍

介绍&#xff1a;蓝牙通信协议详解 1. 蓝牙协议分层 Android主要支持**经典蓝牙&#xff08;Bluetooth Classic&#xff09;和低功耗蓝牙&#xff08;BLE&#xff09;**两种模式&#xff1a; 经典蓝牙&#xff08;BT 2.1/3.0&#xff09; 低功耗蓝牙&#xff08;BLE 4.0&…...

流影---开源网络流量分析平台(四)(分析引擎部署)

目录 功能介绍 部署过程 一、安装依赖环境 二、源码编译部署 三、运行环境配置 四、运行配置 功能介绍 本章我将继续安装流影的分析引擎组件首先&#xff0c;ly_analyser是流影的威胁行为分析引擎&#xff0c;读取netflow v9格式的数据作为输入&#xff0c;运行各种威胁行…...

31天Python入门——第14天:异常处理

你好&#xff0c;我是安然无虞。 文章目录 异常处理1. Python异常2. 异常捕获try-except语句捕获所有的异常信息获取异常对象finally块 3. raise语句4. 自定义异常5. 函数调用里面产生的异常补充练习 异常处理 1. Python异常 Python异常指的是在程序执行过程中发生的错误或异…...

浅析Android Jetpack ACC之LiveData

一、Android Jetpack简介 Android官网对Jetpack的介绍如下&#xff1a; Jetpack is a suite of libraries to help developers follow best practices, reduce boilerplate code, and write code that works consistently across Android versions and devices so that develo…...

【区块链安全 | 第十五篇】类型之值类型(二)

文章目录 值类型有理数和整数字面量&#xff08;Rational and Integer Literals&#xff09;字符串字面量和类型&#xff08;String Literals and Types&#xff09;Unicode 字面量&#xff08;Unicode Literals&#xff09;十六进制字面量&#xff08;Hexadecimal Literals&am…...

深度学习篇---模型训练评估参数

文章目录 前言一、Precision&#xff08;精确率&#xff09;1.1定义1.2意义1.3数值接近11.4数值再0.5左右1.5数值接近0 二、Recall&#xff08;召回率&#xff09;2.1定义2.2意义2.3数值接近12.4数值在0.5左右2.5数值接近0 三、Accuracy&#xff08;准确率&#xff09;3.1定义3…...

SQL Server 可用性组自动种子设定失败问题

目录标题 SQL Server 可用性组自动种子设定失败问题笔记一、问题背景二、错误日志分析错误信息错误代码与分析 三、自动种子设定概述&#xff08;同上&#xff0c;无需修改&#xff09;四、解决步骤1. 备份主数据库2. 在辅助副本上恢复数据库3. 重新启动自动种子设定 SQL Serve…...

02 相机标定相关坐标系

标定相关坐标系 一共四个坐标系 图像像素坐标系: u-v,图像左上角为原点图像物理坐标系: x-y,图像中心为原点...

Ubuntu修改用户名

修改用户名&#xff1a; 1.CTRL ALT T 快捷键打开终端&#xff0c;输入‘sudo su’ 转为root用户。 2.输入‘ gredit /etc/passwd ’&#xff0c;修改用户名&#xff0c;只修改用户名&#xff0c;后面的全名、目录等不修改。 3.输入 ‘ gedit /etc/shadow ’ 和 ‘ gedit /etc/…...

Windows 系统下多功能免费 PDF 编辑工具详解

IceCream PDF Editor是一款极为实用且操作简便的PDF文件编辑工具&#xff0c;它完美适配Windows操作系统。其用户界面设计得十分直观&#xff0c;哪怕是初次接触的用户也能快速上手。更为重要的是&#xff0c;该软件具备丰富多样的强大功能&#xff0c;能全方位满足各类PDF编辑…...

UE学习记录part11

第14节 breakable actors 147 destructible meshes a geometry collection is basically a set of static meshes that we get after we fracture a mesh. 几何体集合基本上是我们在断开网格后获得的一组静态网格。 选中要破碎的网格物品&#xff0c;创建集合 可以选择不同的…...

Redis-07.Redis常用命令-集合操作命令

一.集合操作命令 SADD key member1 [member2]&#xff1a; sadd set1 a b c d sadd set1 a 0表示没有添加成功&#xff0c;因为集合中已经有了这个元素了&#xff0c;因此无法重复添加。 SMEMBERS key: smembers set1 SCARD key&#xff1a; scard set1 SADD key member1 …...

vscode 源代码管理

https://code.visualstudio.com/updates/v1_92#_source-control 您可以通过切换 scm.showHistoryGraph 设置来禁用传入/传出更改的图形可视化。...

arm64位FFmpeg与X264库

参考链接&#xff1a; https://blog.csdn.net/gitblog_09700/article/details/142945092...

iOS审核被拒:Missing privacy manifest 第三方库添加隐私声明文件

问题&#xff1a; iOS提交APP审核被拒&#xff0c;苹果开发者网页显示二进制错误&#xff0c;收到的邮件显示的详细信息如下图: 分析&#xff1a; 从上面信息能看出第三方SDK库必须要包含一个隐私文件&#xff0c;去第三方库更新版本。 几经查询资料得知&#xff0c;苹果在…...