【服务对接】✈️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.xdnf.cn/news/1522296.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ini文件中的节点如何删除?

1、在某些场合中&#xff0c;会将某些数据记录本地情况&#xff0c;会有“保存/加载”过程。 比如&#xff1a; 第一次Write节点信息&#xff08;2个&#xff09;&#xff0c;如下节点 第二次Write节点信息&#xff08;1个&#xff09;&#xff0c;如下节点。会发现本来想写入…

《实战AI大模型》从入门到精通,彻底掌握AI技术

前言 《实战AI大模型》是一本兼具深度和广度的大模型入门书籍&#xff0c;它深入浅出地诠释了AI大模型的核心概念和技术。以大模型为代表的AI2.0是有史以来最重要的技术革命&#xff0c;如果你渴望了解和应用大模型&#xff0c;这本书是一份可贵的“知识基座” 无论你是NLP新手…

使用控制台与键盘进行输入输出

1、控制台简介与初始化 计算机在上电启动后&#xff0c;显示器被默认配置成80x25列的文本显示模式 。其使用从0xb8000开始&#xff0c;一共32KB的显存用于显示。如要在屏幕上指定位置显示特定的字符&#xff0c;则只需找到该位置对应的显存地址&#xff0c;写入2字节的数据&am…

海外直播对网速、带宽、安全的要求

要满足海外直播的要求&#xff0c;需要拥有合适的网络配置。在全球化的浪潮下&#xff0c;海外直播正逐渐成为企业、个人和各类组织的重要工具。不论是用于市场推广、品牌宣传&#xff0c;还是与观众互动&#xff0c;海外直播都为参与者带来了丰富的机会。然而&#xff0c;确保…

【C++从练气到飞升】19---哈希:哈希冲突 | 哈希函数 | 闭散列 | 开散列

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书&#x1f389; 目录 ⛳️推荐 一、unordered 系列关联式容器 二、unordered_map 1.1 unordered_map 介绍 1.2 unordered_map 的…

5大专业措施确保源代码防泄密

深信达的SDC防泄密软件通过一系列创新技术和方法来实现源代码的安全保护&#xff0c;以下是一些关键点和注意事项&#xff1a; 1. **内核级虚拟沙盒技术**&#xff1a;SDC沙盒创建一个与外部环境隔离的执行空间&#xff0c;源代码的编译、运行和调试过程完全隔离于外部操作系统…

部标JT808标准下的视频汇聚新方案:EasyCVR平台助力推动车辆监管智能化进程

在数字化转型的浪潮中&#xff0c;智慧城市的建设正以前所未有的速度推进&#xff0c;而市政车载设备作为城市运行的重要“神经末梢”&#xff0c;其智能化、联网化水平直接影响着城市管理效率与服务质量。近年来&#xff0c;随着部标协议&#xff08;即国家行业标准协议&#…

如何录制黑神话悟空的游戏BGM导入iPhone手机制作铃声?

在游戏的世界里&#xff0c;总有那么一些旋律&#xff0c;能够触动玩家的心弦&#xff0c;让人难以忘怀。《黑神话悟空》以其精美的画面和动人的背景音乐&#xff0c;赢得了无数玩家的喜爱。如果你也想将游戏中的背景音录制下来&#xff0c;制作成个性化的m4r格式铃声&#xff…

实例分割【YOLOv8版】

参考文档 Segment - Ultralytics YOLO Docs​docs.ultralytics.com/tasks/segment/ 何为实例分割&#xff1f; 实例分割比目标检测更进一步&#xff0c;涉及识别图像中的各个对象并将它们与图像的其余部分分割开来。 实例分割模型的输出是一组用于勾勒图像中每个对象的掩码…

element-plus表单项循环的得到的。并且一个项里面有多个子项需要校验。

数据内容循环得到。并且还可以自己增加减少。怎么给他写校验呢&#xff1f; <el-formref"ruleFormRef":rules"rules":model"row" > <el-form-item:label"index>0?:资质及职称"v-for"(item,index) in row!.userTitl…

EE trade:区块链工程专业是什么

区块链技术&#xff0c;作为近年来最具颠覆性的技术之一&#xff0c;正在深刻地改变着我们的生活方式和商业模式。区块链工程专业&#xff0c;应运而生&#xff0c;旨在培养能够胜任区块链领域技术开发、应用和管理的专业人才&#xff0c;为数字经济发展提供强有力的人才支撑。…

HTB-bike(SSTI模版注入)

前言 大家好&#xff0c;我是qmx_07,今天给大家讲解bike靶场 渗透过程 信息搜集 服务器开放了 22 ssh 和 http80端口 Wappalyzer 介绍&#xff1a;Wappalyzer是一种浏览器扩展程序&#xff0c;用于识别正在访问的网站所使用的技术栈和工具&#xff0c;比如使用的web框架&…

算法设计与分析:实验1 排序算法性能分析

1.常见排序算法分析 &#xff08;1&#xff09;选择排序 算法原理&#xff1a; 从数组 a[1--n] 中找到最小的元素&#xff0c;将其与第一个元素 a[1] 进行值的交换&#xff0c;这样数组中第一个位置就是最小的元素&#xff0c;即第一个位置变得有序。接着从数组 a[2--n] 中找…

Codeforces Round 969 (Div. 2 ABCDE题) 视频讲解

A. Dora’s Set Problem Statement Dora has a set s s s containing integers. In the beginning, she will put all integers in [ l , r ] [l, r] [l,r] into the set s s s. That is, an integer x x x is initially contained in the set if and only if l ≤ x ≤…

std::future和std::promise详解(原理、应用、源码)

在编程实践中&#xff0c;我们常常需要使用异步调用。通过异步调用&#xff0c;我们可以将一些耗时、阻塞的任务交给其他线程来执行&#xff0c;从而保证当前线程的快速响应能力。还有一些场景可以通过将一个任务&#xff0c;分成多个部分然后将这部分交给多个线程来进行并发执…

通过FFmpeg和URL查看流的编码格式

FFmpeg下载后会有三个执行文件&#xff0c;跳转到FFmpeg所在文件夹 查看视频流URL地址的编码格式命令&#xff1a; // 在下载ffmpeg的文件夹中执行如下命令&#xff0c;可查看流的编码格式&#xff0c;这里的测试流是H264编码ffprobe http://devimages.apple.com/iphone/sample…

华为打造“新能源航母”,能否挑翻BBA?

华为在汽车行业的动作&#xff0c;频繁让它聚焦在市场镁光灯之下。 前有享界S9陷入飞坡争议&#xff0c;后有智界R7即将登台&#xff0c;后面还有尊界等待亮相&#xff0c;一波又一波的操作令人眼花缭乱。在新能源浪潮之下&#xff0c;BBA的日子并不好过&#xff0c;华为及其他…

VMware Fusion 13.6 发布下载,新增功能概览

VMware Fusion 13.6 发布下载&#xff0c;新增功能概览 VMware Fusion 13.6 for Mac - 领先的免费桌面虚拟化软件 适用于基于 Intel 处理器和搭载 Apple 芯片的 Mac 的桌面虚拟化软件 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-fusion-13/&#xff0c;查看最…

JDBC |封装JDBCUtils|PreparedStatement|事务|批处理|数据库连接池| Blob类型数据的读写|Apache—DBUtils简介

一.概述 在Java中&#xff0c;数据库存取技术可分为如下几类&#xff1a; JDBC直接访问数据库JDO技术&#xff08;Java Data Object&#xff09;第三方O/R工具&#xff0c;如Hibernate, Mybatis 等 JDBC是java访问数据库的基石&#xff0c;JDO, Hibernate等只是更好的封装了J…

单片机-初识单片机(keil安装以及编写简单驱动)(一)

目录 一、嵌入式介绍 1.嵌入式系统&#xff1a; 2.嵌入式操作系统 3.单片机&#xff1a; 二、STM32F103ZET6简介 1.单片机的组成&#xff1a; 2.单片机外观&#xff1a; 3.ARM公司 4.ST公司--意法半导体 三、资料部分 1.安装工具&#xff1a; 2.破解软件&#xff1…