SpringBoot 整合 阿里云 OSS图片上传
一、OOS 简介
阿里云OSS(Object Storage Service)是一种基于云存储的产品,适用于存储和管理各种类型的文件,包括图片、视频、文档等。 阿里云OSS具有高可靠性、高可用性和低成本等优点,因此被广泛应用于各种场景,包括作为图片服务器。
阿里云OSS图片服务提供了多种功能,包括图片信息获取、格式转换、缩放、裁剪、旋转等。用户可以通过简单的RESTful接口在任何时间、任何地点对图片进行处理。此外,阿里云OSS还支持通过URL形式进行图片处理,用户可以通过URL中的QueryString指定处理参数,直接访问处理后的图片,这种方式简单方便,无需编写额外的代码。
二、官网开通服务
1.官网账号注册
阿里云官网阿里云——阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司之一。提供免费试用、云服务器、云数据库、云安全、云企业应用等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。免费备案,7x24小时售后支持,助企业无忧上云。
https://www.aliyun.com/

2.开通OSS服务
(1)点击产品

(2)选择存储就可以看到OSS了

(3)点击OSS进入,选择开通


(4)点击开通之后进入以下,点击立即购买

(5)同意服务,点击去支付

(6)点击支付

(7)成功后点击控制台


(8)点击Bucket(桶)列表

(9)点击创建Bucket(桶)

注意事项:

(10)填写数据
a.名称

b.地域(尽量选离自己比较近的速度会快一些)

c.配置(读写权限要选公共度,其他根据需求来)

创建成功

3.获取AccessKey
(1)点击右上头像,选择AccessKey管理

(2)点击进入之后会弹出一个警告,这里我选 继续使用AccessKey

(3)创建AccessKey

a.安全认证(两种认证方式都行)

b.认证之后,就创建成功了
切记:生成之后要保存好两个AccessKey,后面无法进行查询

二、SpringBoot整合并使用
Java_对象存储(OSS)-阿里云帮助中心
https://help.aliyun.com/zh/oss/developer-reference/java/
1.导入依赖
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>
2.添加配置
aliyun:oss:# OSS服务的节点地址,指定为上海区域endPoint: oss-cn-shanghai.aliyuncs.com# 用户的Access Key ID,用于身份验证accessKeyId: # 用户的Access Key Secret,用于身份验证accessKeySecret: # 访问OSS资源的基础URLaccessPre: https://051104.oss-cn-shanghai.aliyuncs.com/# 存储桶的名称,存储数据的地方bucketName:
配置信息所在地
a.OSS服务的节点地址
进入创建的bucket桶中,点击概览,往下滑就可以看到

b.用户的Access Key ID 和 用户的Access Key Secret
就是创建的accesskey,再次提醒切记要保存accesskey

c.访问OSS资源的基础URL
跟OSS服务的节点地址差不多在同一个地方 ,进入创建的bucket桶中,点击概览,往下滑就可以看到

将配置中红框中的改成自己的

d.存储桶的名称
就是创建bucket(桶)时自己起的名字

3.创建初始化bean
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.annotation.PreDestroy;/*** OSS初始化配置*/
@Log4j2
@Configuration
public class OssConfig {/*** 配置文件中读取阿里云 OSS 的 endpoint,注入到 endPoint 变量中*/@Value("${aliyun.oss.endPoint}")private String endPoint;/*** 从配置文件中读取阿里云 OSS 的 accessKeyId,注入到 accessKeyId 变量中*/@Value("${aliyun.oss.accessKeyId}")private String accessKeyId;/*** 从配置文件中读取阿里云 OSS 的 accessKeySecret,注入到 accessKeySecret 变量中*/@Value("${aliyun.oss.accessKeySecret}")private String accessKeySecret;private OSS ossClient;@Beanpublic OSS init() {// 如果 OSS 客户端尚未初始化,则进行初始化if (ossClient == null) {// 使用 OSSClientBuilder 构建 OSS 客户端,传入 endpoint、accessKeyId 和 accessKeySecretossClient = createOSSClient();// 记录日志,表示连接成功log.info("OSS服务连接成功!");}// 返回初始化好的 OSS 客户端实例return ossClient;}/*** 创建 OSS 客户端的方法*/private OSS createOSSClient() {return new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);}@PreDestroypublic void destroy() {// 关闭 OSS 客户端if (ossClient != null) {// 调用 shutdown() 方法关闭 OSS 客户端ossClient.shutdown();// 记录日志,确认客户端已成功关闭log.info("OSS客户端已成功关闭。");}}
}
4.创建上传工具类
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.PutObjectRequest;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.io.*;
import java.time.LocalDateTime;
import java.util.UUID;/*** OSS 文件管理服务*/
@Log4j2
@Component
public class OssUtil {/** 自动注入 OssConfig 类型的 Bean */@Autowiredprivate OssConfig ossConfig;/** 定义访问前缀,用于构建文件的完整访问路径 */@Value("${aliyun.oss.accessPre}")private String accessPre;/** 定义存储桶名称,方便在上传和下载时引用 */@Value("${aliyun.oss.bucketName}")private String bucketName;/*** 默认路径上传本地文件** @param filePath 本地文件路径* @return 上传后的文件访问路径*/public String uploadFile(String filePath) {return uploadFileForBucket(bucketName, getOssFilePath(filePath), filePath);}/*** 默认路径上传 MultipartFile 文件** @param multipartFile 待上传的文件* @return 上传后的文件访问路径*/public String uploadMultipartFile(MultipartFile multipartFile) {return uploadMultipartFile(bucketName, getOssFilePath(multipartFile.getOriginalFilename()), multipartFile);}/*** 上传 MultipartFile 类型文件到指定 Bucket** @param bucketName 实例名称* @param ossPath OSS 存储路径* @param multipartFile 待上传的文件* @return 上传后的文件访问路径*/public String uploadMultipartFile(String bucketName, String ossPath, MultipartFile multipartFile) {try (InputStream inputStream = multipartFile.getInputStream()) {uploadFileInputStreamForBucket(bucketName, ossPath, inputStream);} catch (IOException e) {log.error("上传文件失败: {}", e.getMessage(), e);return null;}return accessPre + ossPath;}/*** 使用 File 上传文件** @param bucketName 实例名称* @param ossPath OSS 存储路径* @param filePath 本地文件路径* @return 上传后的文件访问路径*/public String uploadFileForBucket(String bucketName, String ossPath, String filePath) {PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, ossPath, new File(filePath));ossConfig.init().putObject(putObjectRequest);return accessPre + ossPath;}/*** 使用文件流上传到指定的 Bucket 实例** @param bucketName 实例名称* @param ossPath OSS 存储路径* @param inputStream 文件输入流*/public void uploadFileInputStreamForBucket(String bucketName, String ossPath, InputStream inputStream) {ossConfig.init().putObject(bucketName, ossPath, inputStream);}/*** 下载文件** @param ossFilePath OSS 存储路径* @param filePath 本地文件路径*/public void downloadFile(String ossFilePath, String filePath) {downloadFileForBucket(bucketName, ossFilePath, filePath);}/*** 从指定 Bucket 下载文件** @param bucketName 实例名称* @param ossFilePath OSS 存储路径* @param filePath 本地文件路径*/public void downloadFileForBucket(String bucketName, String ossFilePath, String filePath) {ossConfig.init().getObject(new GetObjectRequest(bucketName, ossFilePath), new File(filePath));}/*** 获取默认 OSS 存储路径** @return 默认 OSS 存储路径*/public String getOssDefaultPath() {LocalDateTime now = LocalDateTime.now();return String.format("%d/%d/%d/%d/%d/",now.getYear(),now.getMonthValue(),now.getDayOfMonth(),now.getHour(),now.getMinute());}/*** 生成 OSS 文件路径** @param filePath 本地文件路径* @return OSS 文件路径*/public String getOssFilePath(String filePath) {String fileSuffix = filePath.substring(filePath.lastIndexOf(".") + 1);return getOssDefaultPath() + UUID.randomUUID() + "." + fileSuffix;}
}
5.调用上传方法上传图片
import com.chen.system.config.OssUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;/*** OSS 文件控制器*/
@RestController
@RequestMapping("/oss")
public class OssController {@Autowiredprivate OssUtil ossUtil;@PostMapping("/showImg")public String upload(MultipartFile file){return ossUtil.uploadMultipartFile(file);}
}
6.测试
(1)postman测试

(2)浏览器访问链接
访问之后会直接弹出下载框(没有弹出来直接下载的,可能是浏览器没有设置下载时询问)

下载之后

(3)OSS控制台
在bucket列表中找到上传时指定的bucket点击也可查看上传图片呢

相关文章:
SpringBoot 整合 阿里云 OSS图片上传
一、OOS 简介 阿里云OSS(Object Storage Service)是一种基于云存储的产品,适用于存储和管理各种类型的文件,包括图片、视频、文档等。 阿里云OSS具有高可靠性、高可用性和低成本等优点,因此被广泛应用于各种场景&…...
内核编译 设备驱动 驱动程序
内核编译 一、内核编译的步骤 编译步骤: (linux 内核源码的顶层目录下操作 ) 1. 拷贝默认配置到 .config cp config_mini2440_td35 .config 2. make menuconfig 内核配置 make menuconfig 3. make uImage make u…...
自由学习记录
约束的泛型通配符? Java中的泛型 xiaomi和byd都继承了car,但是只是这两个类是car的子类而已,而arraylist<xiaomi> ,arraylist<byd> 两个没有半毛钱继承关系 所以传入的参数整体,是car的list变形,里面的确都能存car…...
在 C# 中使用 LINQ 查询文件列表并找出最大文件
文章目录 1. 环境准备2. 创建项目3. 引入命名空间4. 示例代码5. 运行代码6. 进阶:异常处理7. 总结 在现代 C# 开发中,LINQ (Language Integrated Query) 提供了一种强大而优雅的方式来处理集合数据。本文将详细介绍如何使用 LINQ 查询文件系统中的文件&a…...
数学建模算法与应用 第6章 微分方程建模及其求解方法
目录 6.1 微分方程建模概述 6.2 发射卫星与三阶火箭建模 Matlab代码示例:火箭发射模拟 6.3 微分方程数值解法 Matlab代码示例:欧拉法与龙格-库塔法 6.4 放射性废料的处理 Matlab代码示例:放射性衰变 6.5 初值问题的Matlab数值求解 习…...
数据库的相关知识
数据库的相关知识 1.数据库能够做什么? 存储大量数据,方便检索和访问保持数据信息的一致、完整共享和安全通过组合分析,产生新的有用信息 2.数据库作用? 存储数据、检索数据、生成新的数据 3.数据库要求? 统一、…...
Python cachetools常用缓存算法汇总
文章目录 cachetools介绍缓存操作设置数据生存时间(TTL)自定义缓存策略缓存装饰器缓存清理cachetools 超过缓存数量maxsize cachetools 使用示例 cachetools介绍 cachetools : 是一个Python第三方库,提供了多种缓存算法的实现。缓存是一种用于…...
java类和对象_成员变量方法修饰符局部变量this关键字-cnblog
java类和对象 成员变量 权限修饰符 变量类型 变量名; 成员变量可以是任意类型,整个类是成员变量的作用范围 成员变量 成员方法 权限修饰符 返回值类型 方法名() 成员方法可以有参数,也可以有返回值,用return声明 权限修饰符 private 只能在本类…...
海信和TCL雷鸟及各大品牌智能电视测评
买了型号为32E2F(9008)的海信智能的电视有一段时间了,要使用这个智能电视还真能考验你的智商。海信电视有很多优点,它的屏幕比较靓丽,色彩好看,遥控器不用对着屏幕就能操作。但也有不少缺点。 1. 海信智能电视会强迫自动更新操作…...
Linux 基本系统命令及其使用详解手册(六)
指令:mesg 使用权限:所有使用者 使用方式:mesg [y|n] 说明 : 决定是否允许其他人传讯息到自己的终端机介面 把计 : y:允许讯息传到终端机介面上。 n:不允许讯息传到终端机介面上 。 如果没有设定,则讯息传递与否则由终端机界…...
Oracle架构之段管理和区管理
文章目录 1 段1.1 简介1.1.1 定义1.1.2 分类 1.2 段空间的管理模式1.2.1 手工段空间管理(Manual Segment Space Management)1.2.2 自动段空间管理(Auto Segment Space Management) 1.3 段空间的手工管理(Manual Segmen…...
mybatis-plus转换数据库json类型数据为java对象
JacksonTypeHandler JacksonTypeHandler 可以实现把json字符串转换为java对象。同一类型的handler有: Fastjson2TypeHandlerFastjsonTypeHandlerGsonTypeHandlerJacksonTypeHandler 至于需要哪一个选一个用就好了 使用方式 在实体类中加入注解 TableName(value "table_…...
Java | Leetcode Java题解之第467题环绕字符串中唯一的子字符串
题目: 题解: class Solution {public int findSubstringInWraproundString(String p) {int[] dp new int[26];int k 0;for (int i 0; i < p.length(); i) {if (i > 0 && (p.charAt(i) - p.charAt(i - 1) 26) % 26 1) { // 字符之差为…...
诺贝尔物理奖与化学奖彰显AI力量,探索智能新边界
在今年的诺贝尔物理学奖和化学奖的颁奖典礼上,人工智能(AI)再次成为耀眼的明星。两位物理学奖得主约翰J霍普菲尔德和杰弗里E辛顿因在人工神经网络和机器学习领域的开创性工作而获奖,而化学奖则颁给了在蛋白质结构设计和预测方面做…...
基于京东:HotKey实现自动缓存热点Key!!!
一.引言 某些热点数据,我们提前如果能够预判到的话,可以提前人工给数据加缓存,也就是缓存预热,将其缓存在本地或者Redis中,提高访问性能同时,减低数据库压力,也减轻后端服务的压力。但是&#…...
★ 算法OJ题 ★ 二分查找算法
Ciallo~(∠・ω< )⌒☆ ~ 今天,塞尔达将和大家一起做几道二分查找算法算法题 ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页:椎名澄嵐-CSDN博客 算法专栏:★ 优选算法100天 ★_椎名澄嵐的博客-CSDN博客…...
RTSP RTP RTCP SDP基础知识
理论 流(Streaming ) 是近年在 Internet 上出现的新概念,其定义非常广泛,主要是指通过网络传输多媒体数据的技术总称。 流式传输分为两种 顺序流式传输 (Progressive Streaming) 实时流式传输 (Real time Streaming) …...
静态变量、变量作用域、命名空间
静态变量 静态变量一般位于程序全局data区,只是编程语言根据它所在的scope做语言级别访问限制。 静态变量和全局变量 可以在C语言一个函数中定义static变量,并比较和全局变量的地址差异。 C系语言使用static关键字标示静态变量。 PHP使用大写的STATIC关键…...
Android笔记(二十四)基于Compose组件的MVVM模式和MVI模式的实现
仔细研究了一下MVI(Model-View-Intent)模式,发现它和MVVM模式非常的相识。在采用Android JetPack Compose组件下,MVI模式的实现和MVVM模式的实现非常的类似,都需要借助ViewModel实现业务逻辑和视图数据和状态的传递。在这篇文章中,…...
MySQL 是否支持 XML
MySQL 是否支持 XML:概述与应用 虽然 MySQL 主要以处理关系型数据为主,但它也提供了对 XML 数据的支持。XML(可扩展标记语言)是一种用于数据传输和存储的通用格式。在许多应用场景中,XML 被广泛用于数据交换、配置文件…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...
算法刷题-回溯
今天给大家分享的还是一道关于dfs回溯的问题,对于这类问题大家还是要多刷和总结,总体难度还是偏大。 对于回溯问题有几个关键点: 1.首先对于这类回溯可以节点可以随机选择的问题,要做mian函数中循环调用dfs(i&#x…...
