什么!没有Starter的阿里云OSS也能集成到SpringBoot?

实际上,我们在Maven存储库中尝试搜索阿里云OSS。在此过程中,我们会发现阿里云官方未提供一种集成Spring Boot的模式,即xxx-Springboot-Starter,显然,这是一个需要自行定制的组件。然而,如今许多企业在研发过程中,基本上90%的项目都采用了Spring Boot。因此,若有与阿里云OSS对接的需求,倘若官方已提供了相应的Spring Boot快速启动集成包,那么我们的使用将会非常便捷。然而,鉴于官方并未实施该操作,我们必须手动将其集成至Spring Boot。以下文章将为大家演示如何实现该集成。

在这里插入图片描述

第一步,我们需要新建一个spring boot的项目

在这里插入图片描述

第二步,引入阿里云OSS的包

<!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version><scope>provided</scope></dependency>

第一个是阿里云OSS的包,第二个是lombok的包,可以不引入(根据实际情况自行引入)

第三步,新建三个软件包

在这里插入图片描述

分别是:
config 包:存放springboot的Configuration的地方,即配置bean的地方
service: 我们业务类的业务方法存放的地方
util:封装一些阿里云OSS的api的地方

第四步,新建配置类

package com.masiyi.aliyun.config;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyuncs.exceptions.ClientException;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @Author masiyi* @Date 2024/3/15* @PackageName:com.masiyi.aliyun.config* @ClassName: AliyunConfig* @Description: TODO* @Version 1.0*/
@Data
@Configuration
@ConfigurationProperties(prefix = "aliyun")
public class AliyunConfig {private String endpoint;private String bucketName;private String accessKeyId;private String accessKeySecret;@Beanpublic OSS getAliyun() {// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。// 填写Bucket名称,例如examplebucket。// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);}
}

这是一个名为AliyunConfig的Java类,使用了@Data、@Configuration和@ConfigurationProperties注解。

  • @Data注解:这是Lombok库提供的注解,用于自动生成Java类的getter、setter、equals、hashCode和toString等方法。
  • @Configuration注解:表明这是一个配置类,Spring会在应用启动时加载并处理该类。
  • @ConfigurationProperties(prefix = “aliyun”)注解:指定了属性配置的前缀为"aliyun",用于将配置文件中以"aliyun"开头的属性值注入到该类的对应字段中。
  • AliyunConfig类:包含了endpoint、bucketName、accessKeyId和accessKeySecret等属性,用于配置阿里云OSS服务的相关信息。
  • @Bean注解:在配置类中定义了一个名为getAliyun()的Bean方法,用于创建并返回一个OSSClient实例,用于访问阿里云OSS服务。
  • getAliyun()方法:在方法中使用了OSSClientBuilder来构建一个OSSClient实例,传入了endpoint、accessKeyId和accessKeySecret等属性值。

这个时候我们就实现了对阿里云OSS服务的配置和Bean的定义,使得应用可以方便地访问和使用阿里云OSS服务。以后使用的时候直接在业务类里面 @Autowired直接注入OSS这个类即可。

第五步,封装阿里云oss的api

package com.masiyi.aliyun.util;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import com.aliyun.oss.model.PutObjectResult;
import com.masiyi.aliyun.config.AliyunConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;/*** @Author masiyi* @Date 2024/3/15* @PackageName:com.masiyi.aliyun.util* @ClassName: AliyunUtil* @Description: TODO* @Version 1.0*/
@Component
@Slf4j
public class AliyunUtil {@Autowiredprivate OSS oss;@Autowiredprivate AliyunConfig aliyunConfig;/*** 上传文件** @param txt* @param objectName*/public PutObjectResult putObject(String txt, String objectName) {try {return oss.putObject(aliyunConfig.getBucketName(), objectName, new ByteArrayInputStream(txt.getBytes()));} catch (OSSException oe) {log.error(oe.getMessage(),oe);} catch (ClientException ce) {log.error(ce.getMessage(),ce);} finally {if (oss != null) {oss.shutdown();}}return null;}/*** 上传图片** @param inputStream* @param fileName*/public PutObjectResult putImage(InputStream inputStream, String fileName) {try {return oss.putObject(aliyunConfig.getBucketName(), fileName, inputStream);} catch (OSSException oe) {log.error(oe.getMessage(),oe);} catch (ClientException ce) {log.error(ce.getMessage(),ce);} finally {if (oss != null) {oss.shutdown();}}return null;}/*** 创建存储空间。*/public Bucket createBucket(String bucketName) {Bucket bucket = null;try {// 创建存储空间。bucket = oss.createBucket(bucketName);} catch (OSSException oe) {log.error(oe.getMessage(),oe);} catch (ClientException ce) {log.error(ce.getMessage(),ce);} finally {if (oss != null) {oss.shutdown();}}return bucket;}/*** 下载文件 以下代码用于通过流式下载方式从OSS下载文件。*/public void getObject(String bucketName, String objectName) {try {// 调用ossClient.getObject返回一个OSSObject实例,该实例包含文件内容及文件元数据。OSSObject ossObject = oss.getObject(bucketName, objectName);// 调用ossObject.getObjectContent获取文件输入流,可读取此输入流获取其内容。InputStream content = ossObject.getObjectContent();if (content != null) {BufferedReader reader = new BufferedReader(new InputStreamReader(content));while (true) {String line = reader.readLine();if (line == null) {break;}System.out.println("\n" + line);}// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。content.close();}} catch (OSSException oe) {log.error(oe.getMessage(),oe);} catch (ClientException ce) {log.error(ce.getMessage(),ce);} catch (IOException e) {throw new RuntimeException(e);} finally {if (oss != null) {oss.shutdown();}}}/*** 列举文件* 以下代码用于列举存储空间bucket下的文件。默认列举100个文件。** @param bucketName* @return*/public ObjectListing listObjects(String bucketName) {ObjectListing objectListing = null;try {// ossClient.listObjects返回ObjectListing实例,包含此次listObject请求的返回结果。objectListing = oss.listObjects(bucketName);// objectListing.getObjectSummaries获取所有文件的描述信息。for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {System.out.println(" - " + objectSummary.getKey() + "  " +"(size = " + objectSummary.getSize() + ")");}} catch (OSSException oe) {log.error(oe.getMessage(),oe);} catch (ClientException ce) {log.error(ce.getMessage(),ce);} finally {if (oss != null) {oss.shutdown();}}return objectListing;}/*** 删除文件* 以下代码用于删除指定文件* @param bucketName* @param objectName*/public void deleteObject(String bucketName, String objectName) {try {// 删除文件。oss.deleteObject(bucketName, objectName);} catch (OSSException oe) {log.error(oe.getMessage(),oe);} catch (ClientException ce) {log.error(ce.getMessage(),ce);} finally {if (oss != null) {oss.shutdown();}}}}

这里最关键的两行代码就是:

    @Autowiredprivate OSS oss;@Autowiredprivate AliyunConfig aliyunConfig;

其中我们引入的OSS 类是为了调用阿里云oss的api,AliyunConfig 则是我们为了使用里面的属性,而这个util里面的方法就是可以直接参考阿里云官方的文档进行一个封装,例如我们看阿里云的api文档:

package com.masiyi.aliyun;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;public class Demo {public static void main(String[] args) throws Exception {// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 填写Bucket名称,例如examplebucket。String bucketName = "examplebucket";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);try {// 创建存储空间。ossClient.createBucket(bucketName);} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}}
}

其实在这一段代码中:

   // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 填写Bucket名称,例如examplebucket。String bucketName = "examplebucket";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

我们已经在AliyunConfig这个类里面已经配置好了基础的信息,而且我们已经把oss利用spring的ioc功能交给spring去管理了,所以我们就可以每次直接从sring的ioc容器里面直接拿来用即可。我们其实要改的只是下面实际调用的代码。所以我们只需要把这个Demo类给封装成一个方法就好了,类似上面util类里面的createBucket方法这样。

第六步,编写自己的业务类

package com.masiyi.aliyun.service;import com.masiyi.aliyun.util.AliyunUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.InputStream;/*** @Author masiyi* @Date 2024/3/15* @PackageName:com.masiyi.aliyun.service* @ClassName: AliyunService* @Description: TODO* @Version 1.0*/
@Service
public class AliyunService {@Autowiredprivate AliyunUtil aliyunUtil;public void putObject() {aliyunUtil.putObject("你好", "objectName.txt");}public void putImage(InputStream inputStream, String imgName) {aliyunUtil.putImage(inputStream, "markdown" + imgName);}
}

在业务类中我们直接注入AliyunUtil 类,之后就可以愉快的使用阿里云oss了!

第七步,填写你的阿里云oss的信息

spring.application.name=aliyunaliyun.bucketName=masiyi
aliyun.endpoint=https://oss-cn-guangzhou.aliyuncs.com
aliyun.accessKeyId=LTAI5tRbBzEmyo9mosdfeqqc
aliyun.accessKeySecret=aDcdesfefa02V42TGstfAJ42Ma9

这样我们的阿里云OSS的api也就集成到SpringBoot中了。

博客中的项目地址已开源,详情查看springboot+aliyun-sdk-oss

在这里插入图片描述

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

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

相关文章

LeetCode | 520.检测大写字母

这道题直接分3种情况讨论&#xff1a;1、全部都为大写&#xff1b;2、全部都为小写&#xff1b;3、首字母大写其余小写。这里我借用了一个全是大写字母的串和一个全为小写字母的串进行比较 class Solution(object):def detectCapitalUse(self, word):""":type …

【机器学习】计算机图形和深度学习模型NeRF详解(1)

1.引言 1.1.1. NeRF研究的背景 人们在拍照的时候&#xff0c;往往会中各个角度进行拍摄&#xff0c;以呈现出物体的全貌和美丽。下图的照片&#xff0c;拍摄的是一架楼梯&#xff0c;但是拍摄的角度完全不同&#xff1a; 我们可以看到这些图片都是楼梯的照片&#xff0c;但拍…

Training language models to follow instructions with human feedback 论文阅读

论文原文&#xff1a;https://arxiv.org/pdf/2203.02155 论文简介 语言模型越大并不意味着它能更好的理解用户的意图&#xff0c;因此在这篇论文中&#xff0c;展示了根据人的反馈对模型进行微调&#xff0c;使得语言模型能够在各种人物上更好的理解用户的意图。在评估中&…

树莓派4B学习笔记11:PC端网线SSH连接树莓派

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 今日学习使用网线连接树莓派&#xff0c;网线可以提供更…

使用 C# 学习面向对象编程:第 8 部分

抽象方法 亲爱的读者&#xff0c;本文是 OOP 的第四大支柱&#xff0c;也是最后一大支柱。对于 OOP 初学者来说&#xff0c;这很容易让人困惑。因此&#xff0c;我们用非常简单的语言提供了一个示例。 “抽象用于管理复杂性。无法创建抽象类的对象。抽象类用于继承。” 例如…

降噪领夹麦克风哪个牌子好?揭秘无线领夹麦克风哪个降噪好

相信很多新手视频创作者都有一个疑问&#xff1a;为什么别人的视频或者直播音质这么清晰&#xff0c;几乎没什么噪音呢&#xff1f;其实最主要的就是麦克风的原因&#xff0c;相机或手机内置的麦克风是无法提供高质量的音频记录以及很好的指向性的。 想要拍摄出来的视频作品拥有…

每一个男人都曾有一个机器人的梦想

每一个男人都曾有一个机器人的梦想 我也有 每一个男人都曾有一个机器人的梦想。对于我来说&#xff0c;这个梦想始于童年时代&#xff0c;那时变形金刚风靡一时&#xff0c;几乎所有80后的孩子都为之疯狂。我是80后中的一员&#xff0c;那时候的科技还远没有如今这般发达&#…

《现代通信原理与技术》码间串扰和​​​​​​​无码间串扰的眼图对比实验报告

实 验&#xff1a;码间串扰和无码间串扰的眼图对比实验报告 摘 要&#xff1a; 在数字通信系统中&#xff0c;码间串扰&#xff08;Inter-Symbol Interference, ISI&#xff09;是影响信号质量和系统性能的重要因素之一。本实验通过MATLAB软件生成并对比了受码间串扰影响和未…

华为昇腾异构计算架构CANN及AI芯片简介

异构计算架构CANN 异构计算架构CANN&#xff08;Compute Architecture for Neural Networks&#xff09;是华为针对AI场景推出的异构计算架构&#xff0c;向上支持多种AI框架&#xff0c;包括MindSpore、PyTorch、TensorFlow等&#xff0c;向下服务AI处理器与编程&#xff0c;…

Open To Buy(OTB)计划:零售业者的库存管理利器

在当今快速变化的服装市场中&#xff0c;如何高效、精准地进行商品管理成为了服装企业竞争的关键。OTB&#xff08;Open-to-Buy&#xff09;作为一种有效的商品管理方法&#xff0c;在企业管理中扮演着至关重要的角色。它基于预算、商品计划以及市场需求等多维度因素&#xff0…

Android开发系列(二)Jetpack Compose 之Text控件

Jetpack Compose是一种全新的声明式UI框架&#xff0c;用于构建Android应用程序。Jetpack Compose Text控件是Compose中用于显示文本的基本UI组件。 Text是一个可组合函数&#xff0c;函数声明如下所示。 Composable fun Text(text: String,modifier: Modifier Modifier,colo…

AGI 远不止 ChatGPT!一文入门 AGI 通识及应用开发

AI 大语言模型进入爆发阶段 2022 年 12 月 ChatGPT 突然爆火&#xff0c;原因是其表现出来的智能化已经远远突破了我们的常规认知。虽然其呈现在使用者面前仅仅只是一个简单的对话问答形式&#xff0c;但是它的内容化水平非常强大&#xff0c;甚至在某些方面已经超过人类了&am…

k8s上使用ConfigMap 和 Secret

使用ConfigMap 和 Secret 实验目标&#xff1a; 学习如何使用 ConfigMap 和 Secret 来管理应用的配置。 实验步骤&#xff1a; 创建一个 ConfigMap 存储应用配置。创建一个 Secret 存储敏感信息&#xff08;如数据库密码&#xff09;。在 Pod 中挂载 ConfigMap 和 Secret&am…

计算机视觉全系列实战教程:(八)图像变换-点运算、灰度变换、直方图变换

图像变换&#xff1a;点运算、灰度变换、直方图变换 1.点运算(1)What(2)Why 2.灰度变换(1)What(2)Why(作用)(3)Which(有哪些灰度变换&#xff09; 3.直方图修正(1)直方图均衡化 1.点运算 (1)What 通过点运算&#xff0c;输出图像的每个像素的灰度值仅仅取决于输入图像中相对应…

【招联消费金融股份】有限公司2024年5月18日【算法开发岗暑期实习】一面试经验分享

招联消费金融股份有限公司2024年5月18日面试经验分享 面试流程&#xff1a;共30多分钟&#xff0c;先3分钟自我介绍&#xff0c;然后细细介绍简历上面的论文和实习信息。问题1&#xff1a;扩散模型的noise schedule有什么研究。问题2&#xff1a;有哪些常见的数学分布问题3&…

新版嘎嘎快充互联互通系统配置文档

宝塔环境配置 登录宝塔账号&#xff0c;安装nginx、mysql5.7、php7.2、supervisor、redisphp安装扩展&#xff1a; 1&#xff09;安装swooleloader72 将嘎嘎官方提供的swoole_loader_72_nts.so文件上传到 /www/server/php/72/lib/php/extensions/no-debug-non-zts-20170718…

Spring的事务步骤

一、事务处理方案&#xff1a; Spring框架中提供的事务处理方案&#xff1a;一共有两种&#xff1a; 1.适合中小项目使用的&#xff0c; 注解方案&#xff1a; 注解的方式做事务用起来简单&#xff0c;灵活&#xff0c;方便&#xff0c;中小型项目中用它比较方便&#xff0c…

基于STM32和人工智能的智能水质监测系统

目录 引言环境准备智能水质监测系统基础代码实现&#xff1a;实现智能水质监测系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;智能水质管理与优化问题解决方案与优化收尾与总结 1. 引言 随着环境保护意识的提高&#xf…

【C/C++】【学生成绩管理系统】深度剖析

可接各类C/C管理系统课设 目录 实现功能 部分1&#xff1a;系统设置和主菜单 1. 引入头文件 2. 定义结构体 3. 函数声明 4. 主函数 部分2&#xff1a;添加学生信息 部分3&#xff1a;删除学生信息 部分4&#xff1a;修改学生信息 部分5&#xff1a;查询学生信息 部分…

数组元素的内存地址计算【数据结构与算法C#版】

数组元素被存储在连续的内存空间中&#xff0c;这意味着计算数组元素的内存地址非常容易。给定数组内存地址&#xff08;首 元素内存地址&#xff09;和某个元素的索引&#xff0c;我们可以使用下方图 所示的公式计算得到该元素的内存地址&#xff0c;从而直接 访问该元素。 观…