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 被广泛用于数据交换、配置文件…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...