【服务对接】✈️SpringBoot 项目整合华为云 obs 对象存储服务

目录

👋前言

👀一、环境准备

🌱二、整合实现

        1.依赖引入

        2.准备 AK 和 SK

​        3.配置类

        4.obs 工具类封装

💞️三、测试使用

🍻四、 obs 客户端

 📫五、章末


👋前言

        小伙伴们大家好,上次了解了如何通过 Java 将文本转为语音,是借助 Jacob 工具实现,可以说是引入了第三方工具类,通过 java 代码调用该工具提供的 api 即可实现我们想要的功能,也算是简单的调用第三方组件;在生产项目中也常见这种三方对接,比如最近了解的华为云对象存储服务,需要将用户所上传的图片文件转移到别的服务,而不是存储在服务器上,这种就可以借助三方服务实现,以减少服务器存储压力,并且适合微服务项目使用;

👀一、环境准备

        1.因为是基于生产项目整合华为云 obs 所以本篇文章不会从如何注册华为云账号开始,本篇文章基于已有华为云存储的鉴权 Key 实现,我们只需要这些 关键 key 值即可,以及开发文档

        这里给大家收集了华为云官方提供的文档可以参考下:

https://console.huaweicloud.com/apiexplorer/#/sdkcenter/OBS?lang=Java

        2.本地项目使用的是 SpringBoot 项目,可以通过 Spring Intilior 简单的创建一个

🌱二、整合实现

        1.依赖引入

        除了关键 key 值以外,我们需要在代码中调用华为云对象存储服务的 api (以下简称 obs),所以需要引入相应的依赖,在pom.xml 文件中加入以下内容,刷新 maven 即可自动下载所需依赖,版本可以自己选择更改

        <dependency><groupId>com.huaweicloud</groupId><artifactId>esdk-obs-java</artifactId><version>3.20.6.1</version></dependency>
        2.准备 AK 和 SK

        这两个属性在华为云接口文档上也有标明 ,将有效的 key 值放到项目的配置文件中,本地使用的是 yml 文件,所以格式如下:    

huawei:obs:endpoint: obs.cn-east-3.myhuaweicloud.comaccessKey: abcde*************secretAccessKey: adcde***********bucketName: my-test-bucketexpiration: 60

         注:这里的额外几个参数意思如下:

        bucketName: 像阿里云oss,华为云obs 这些服务的存储都有一个重要的概念,bucket 简称桶,相当于一个文件夹,里面可以存放很多文件,主要的作用就是区分存储位置,也是在管理页面自己设置,本地设置好之后,后续代码调用上传的都是指定的 bucket 内,方便管理

        endPoint: 在obs文档上有说明,本地根据地区选择的是 华东-上海二 终端节点

        expiration: 指定生成文件下载链接的有效时长(秒)

         3.配置类

        配置文件整理好后,为了后续方便代码调用,需要将 obs 配置映射为一个文件对象,也就是 bean 实例,如下:

        @ConfigurationProperties 中指定了映射的配置内容为 huawei.obs 开头的内容

        @Component 注解中指定了改 bean 实例的名称,这么做是为了防止后续项目启动时找到重名的 bean 导致报错,因为引入的包中可能含有同名的类,这样在注入的时候也指定一下名称,可以避免很多意意想不到的错误

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Component("OBSProperties")
@ConfigurationProperties(prefix = "huawei.obs")
public class ObsProperties {private String endpoint;private String accessKey;private String secretAccessKey;private String bucketName;private Long expiration;
}
        4.obs 工具类封装
@Component
public class ObsUtil {private ObsClient obsClient;@Resource(name = "OBSProperties")private ObsProperties obsProperties;//初始化 ObsUtil 工具类 bean@PostConstructpublic void init() {obsClient = new ObsClient(obsProperties.getAccessKey(), obsProperties.getSecretAccessKey(),obsProperties.getEndPoint());}//注意这里传进来的参数是处理后的图片 base64 参数,处理方法只需要调用 api,这里不做过多解释,可以上网查询转换方法,另外是指定的文件名称和bucket名称,上传后的文件将是以该 fileName 存在于该bucket 内//此方法是用于上传文件,内部调用了 obs 的含有 MD5 参数校验的api方法public void uploadPic(String base64, String fileName) {byte[] bytes = transBase64ToByte(base64);ObjectMetadata meta = new ObjectMetadata();// 设置MD5校验。String md5 = toBase64String(calculateMd5(bytes));meta.setContentMd5(md5);try (InputStream inputStream = new ByteArrayInputStream(bytes)) {PutObjectResult result = obsClient.putObject(obsProperties.getBucketName(), fileName, inputStream,meta);} catch (Exception e) {log.error("Upload failed: ", e);}}// 计算 MD5 值的方法private static byte[] calculateMd5(byte[] data) {try {MessageDigest md = MessageDigest.getInstance("MD5");return md.digest(data);} catch (NoSuchAlgorithmException e) {throw new RuntimeException("MD5 algorithm not found.", e);}}// 将字节数组转换为 Base64 编码的字符串private static String toBase64String(byte[] bytes) {return Base64.getEncoder().encodeToString(bytes);}//该方法是用于检查bucket 内是否有指定文件,内部调用了 obs 的获取文件方法public Boolean checkExist(String fileName) {ObsObject object = null;InputStream inputStream = null;try {object = ObsClient.getObject(bucketName, fileName);inputStream = object.getObjectContent();if (inputStream != null) {return true;}} catch (Exception e) {log.error("请求异常:{}", fileName, e);return false;} finally {// 确保关闭 InputStreamtry {if (inputStream != null) {inputStream.close();}} catch (IOException e) {log.error("关闭 InputStream 异常", e);}}return false;}//该方法是用于获取指定时间内的文件下载链接public String getPicViewUrlByInternal(String fileName) {Boolean aBoolean = checkExist(fileName,obsProperties.getBucketName());if (!aBoolean) {return null;}// 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。String url = generatePresignedUrl(obsProperties.getExpiration(), fileName,obsProperties.getBucketName());return url;}private static String generatePresignedUrl(Long expire,String fileName,String bucketName) {TemporarySignatureResponse response = null;try {// URL有效期,3600秒//long expireSeconds = 3600L;TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expire);request.setBucketName(bucketName);request.setObjectKey(fileName);response = obsClient.createTemporarySignature(request);} catch (ObsException e) {log.error("get obs failed :{}", e.getMessage());throw new ServiceException(Messages.getByCode("errors.obs.urlError"));}return Optional.ofNullable(response).map(TemporarySignatureResponse::getSignedUrl).orElse(null);}}

💞️三、测试使用

        在 项目 test/java 下创建单元测试类,这里知识给大家做个展示,平时写好接口之后如何在单元测试类中测试,这里不做具体测试(由于设备原因等,后续也许会更新)

        注:单元测试类必须写在 test 目录下,否则会有注解报错问题

        @SpringBootTest 注解指定了项目启动类,根据自己项目改变

        @SpringRunner 不用改,固定的即可

        @Test 标注为测试方法,可以开启调试或运行功能

@SpringBootTest(classes = TestApplication.class)
@Slf4j
@RunWith(SpringRunner.class)
public class ObsTest {@Resourceprivate ObsUtil obsUtil;@Testpublic void TestUtil(){obSUtil...}}

🍻四、 obs 客户端

        当然除了代码中的调用方式,华为云也是有相对应的管理客户端,通过该应用也可以管理 bucket 文件的上传和删除,当然我们使用的话主要是用来检查文件是否上传成功之类的

        可以搜索 OBS Browser ,下载到本地启动之后的登录页面,选择 AK 方式登录,也就是代码配置文件中的 ak ,账号名这里可以自定义,重要的是 AccessKey 和 Secret Access Key ,访问路径可以不用填写

        登录后的界面如下:点击 bucket 会进入到桶内可以查看当前 bucket 内有哪些文件

 📫五、章末

        另外,因为设备等一些原因,没有对工具类方法测试,可能会有一些小问题,但是后续可能会更新

        文章到这里就结束了~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/413457.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle查询优化--分区表建立/普通表转分区表

本文介绍了Oracle表分区的方法&#xff0c;将已有的非分区表转化为分区表&#xff0c;也可以直接建立新的分区表&#xff0c;从而实现大表查询的优化。主要通过DBMS_REDEFINITION 和 alter table xxx modify 方法&#xff0c;DBMS_REDEFINITION 适用于所有版本&#xff0c;操作…

计算机毕业设计选题推荐-大学生竞赛管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

【C++ 第十六章】哈希

1. unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到 &#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好 的查询是&#xff0c;进行…

基于爬山法MPPT和PI的直驱式永磁同步风力发电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 PMSM 4.2 MPPT 4.3 PI 控制器原理 5.完整工程文件 1.课题概述 基于爬山法最大功率点跟踪 (Maximum Power Point Tracking, MPPT) 和比例积分控制器 (Proportional Integral, PI) 的直驱式永磁同步…

两个月冲刺软考——关系模式中的候选关键字与如何分解为无损连接并保持函数依赖的解法(例题讲解,看完必会)

1. 数据库中的简单属性、多值属性、复合属性、派生属性 简单属性&#xff1a;指不能够再分解成更小部分的属性&#xff0c;通常是数据表中的一个列。例如学生表中的“学号”、“姓名”等均为简单属性。 多值属性&#xff1a;指一个属性可以有多个值。例如一个学生可能会有多个…

栈OJ题——有效的括号

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 有效的括号 题目描述&#xff1a;给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。括号匹配。 二、…

异业联盟的巅峰之作!某店生活 两年百亿销售额!

大家好 我是一家软件开发公司的产品经理 吴军 最近有个爆火的商业模式 带动了三方消费 平台能赚到钱 消费者能省钱 商家也能获取到客源甚至还能赚钱 他究竟是怎么样做到三方都赚到钱的&#xff1f; 在当前经济形势下&#xff0c;许多消费者变得谨慎&#xff0c;减少了不必…

100天带你精通Python——第8天面向对象编程

文章目录 前言面向对象技术简介类&#xff08;Class&#xff09;对象&#xff08;Object&#xff09;继承&#xff08;Inheritance&#xff09;封装&#xff08;Encapsulation&#xff09;多态&#xff08;Polymorphism&#xff09;Python类详解静态变量&#xff08;Static Var…

day39(8/29)——harbor私有仓库管理

一、harbor私有仓库管理 是python的包管理工具&#xff0c;和yum对redhat的关系是一样的 yum -y install epel-release yum -y install python2-pip pip install --upgrade pip pip list pip 8x pip install --upgrade pip pip install --upgrade pip20.3 -i https://mirror…

应用层(Web与HTTP)

目录 常见术语 1.HTTP概况 2.HTTP连接 非持久HTTP流程 响应时间模型 持久HTTP 3.HTTP报文 3.1HTTP请求报文 3.2HTTP响应报文 HTTP响应状态码 4.Cookies&#xff08;用户-服务器状态&#xff09; cookies&#xff1a;维护状态 Cookies的作用 5.Web缓冲&#xff08;…

yolo格式数据集|自动驾驶|5类别|数据集已划分好|可以直接使用|yolov5|v6|v7|v8|v9|v10通用

本数据为自动驾驶检测数据集&#xff0c;数据集是车类摄像头在不同场景下拍摄&#xff0c;有5类&#xff0c;分别为car、truck、person、bicycle、traffic_light。数据集整理不易&#xff0c;获取地址在最后。 数据集数量如下&#xff1a; 总共有:18000张 训练集&#xff1a;14…

【卷起来】VUE3.0教程-01-环境搭建与安装

​分享不易&#xff0c;耗时耗力&#xff0c;麻烦给个不要钱的关注和赞吧 &#x1f332; 什么是VUE Vue 是一个框架&#xff0c;也是一个生态。其功能覆盖了大部分前端开发常见的需求。但 Web 世界是十分多样化的&#xff0c;不同的开发者在 Web 上构建的东西可能在形式和规模…

算法-最长连续序列

leetcode的题目链接 这道题的思路主要是要求在O&#xff08;n)的时间复杂度下&#xff0c;所以你暴力解决肯定不行&#xff0c;暴力至少两层for循环&#xff0c;所以要在O&#xff08;n)的时间复杂度下&#xff0c;你可以使用HashSet来存储数组&#xff0c;对于每个数字&#…

给鼠标一个好看的指针特效 鼠标光标如何修改形状?

许多爱美的小伙伴们都想着如何给自己的电脑打扮一下&#xff0c;用各种各样的途径来美化我们的电脑。今天我们给大家分享一下&#xff0c;如何美化鼠标效果&#xff0c;给鼠标指针修改成一个非常好看的形状~ 一起来看几组鼠标的效果&#xff0c;小编我给大家做了个录屏&#x…

YoloV8实战:使用YoloV8实现OBB框检测

定向边框(OBB)数据集概述 使用定向边界框(OBB)训练精确的物体检测模型需要一个全面的数据集。本文解释了与Ultralytics YOLO 模型兼容的各种 OBB 数据集格式,深入介绍了这些格式的结构、应用和格式转换方法。数据集使用DOTA。 YOLO支持的 OBB 格式 在Ultralytics YOLO …

AI编码新时代:免费人工智能助手Blackbox AI

前言&#xff1a; 在当今快速发展的科技时代&#xff0c;人工智能已经渗透到我们生活的方方面面&#xff0c;从智能手机的语音助手到智能家居控制系统&#xff0c;再到在线客服和个性化推荐算法&#xff0c;AI智能工具正变得越来越普遍。它们以其高效、智能和用户友好的特性&am…

git常见命令行及分支规范

文章目录 GIT常见命令行原理图基本设置初始化和克隆仓库文件管理提交更改查看状态和历史分支管理远程仓库交互高级功能GIT常见分支风格1. 单一主干分支(Single Main Branch)//极少使用优点:缺点:2. 多主干分支(Multiple Main Branches)//个人小型项目采用优点:缺点:3. …

redis的共享session应用

项目背景&#xff1a; 该项目背景就是黑马的黑马点评项目。 一&#xff1a;基于Session实现验证码登录流程 基本的登录流程我们做了很多了。这个是短信登录流程 其实和普通的登录流程就多了一个生成验证码&#xff0c;并将验证码保存在session中&#xff0c;并且呢&#xf…

《JavaEE进阶》----1.<JavaEE进阶可以学到什么>

本篇博客会讲到 一、JavaEE进阶学习内容&#xff1a; 1.框架的学习&#xff1a;Spring、Spring Boot、Spring MVC、MyBatis 2.大项目实践 3.源码阅读 二、JavaEE简介 B/S架构web开发流程 web前端开发&#xff08;了解&#xff09; web后端开发&#xff08;重点&#xff09; 三、…

【C++】OJ习题 篇2

&#x1f680;个人主页&#xff1a;奋斗的小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 &#x1f4a5;1、删除有序数组中的重复项&#x1f4a5;2、数组中出现次数超过一半的数字&#x1f4a5;3、最…