go语言对接S3存储的SDK(支持minio和OSS)

2024-06-21 01:04

本文主要是介绍go语言对接S3存储的SDK(支持minio和OSS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

在某个项目中,客户要求支持S3协议的存储,因为之前的项目是go来开发的支持的oss和minio 。
但并不一定支持S3的协议,而且使用了二种SDK,感觉比较麻烦。
既然客户提出来了要求。那我们改一下就是了。 

操作

引入

go语言中有对s2存储有二个版本,这里我们使用v2的版本。

主要看 使用的是v2版本

这里我引入了4个包 以及对应的版本, 大家可以直接go get 下载最新的应该也是可以的
比如: get get github.com/aws/aws-sdk-go-v2

	github.com/aws/aws-sdk-go-v2 v1.30.0github.com/aws/aws-sdk-go-v2/config v1.27.21github.com/aws/aws-sdk-go-v2/credentials v1.17.21github.com/aws/aws-sdk-go-v2/service/s3 v1.56.1

代码实现

工具类

type S3Client struct {endpoint        stringaccessKeyId     stringaccessKeySecret stringclient          *s3.Clientbucket          stringregion          string
}func NewS3Client(endpoint, akId, akSecret, region string) S3Client {return S3Client{endpoint:        endpoint,accessKeyId:     akId,accessKeySecret: akSecret,region:          region,}
}func (c *S3Client) InitClient(bucket string, UsePathStyle bool) error {cfg, err := config.LoadDefaultConfig(context.TODO(),config.WithRegion(c.region),config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(c.accessKeyId, c.accessKeySecret, "")),config.WithEndpointResolver(aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) {return aws.Endpoint{URL: c.endpoint,}, nil})),)c.bucket = bucketif err != nil {return err}c.client = s3.NewFromConfig(cfg, func(o *s3.Options) {o.UsePathStyle = UsePathStyle})return nil
}func (c *S3Client) PutObj(bucket, project, data string) error {_, err := c.client.PutObject(context.TODO(), &s3.PutObjectInput{Bucket: aws.String(bucket),Key:    aws.String(project),Body:   strings.NewReader(data),})return err
}func (c *S3Client) PutObjUseDefBucket(project, data string) error {if c.bucket == "nil" {return &thisErr{"Default Bucket is nil !!!"}}return c.PutObj(c.bucket, project, data)
}type thisErr struct {S string
}func (e thisErr) Error() string {return e.S
}

调用

func Init() bool {c.ossClt = S3OSSCliet.NewS3Client(Config.C.OssEndpoint, Config.C.OssAkId, Config.C.OssAkSecret, Config.C.Region)e := c.ossClt.InitClient(Config.C.OssBucket, Config.C.OSSType == "1")if e != nil {logger.Logf(logger.ERROR, "Init Oss Client Error! err:%s", e)}e = c.ossClt.PutObjUseDefBucket("路径", "base64的图片数据")return true
}

我这里的4个参数是写成了配置的, 大家测试的时候修改成自己的参数就可以了。
另外需要修改路径和一个base64的图片数据就可以了,这个简单相信大家都会弄的。
我这里就不写了。

配置文件

 <OssEndpoint>http://xxx:9000/</OssEndpoint><OssAkId>xxx</OssAkId><OssAkSecret>minioadmin</OssAkSecret><OssBucket>test</OssBucket><Region>us-west-2</Region><!--    0: AliyunOSS    1:minioOSS--><OSSType>1</OSSType>

遇到的问题点

解决go语言对接s3的SDK上传文件遇到的问题
里面有说具体的问题点、原因。
当然如果按照我上述配置的话,不会存在问题。
坑的话我已经踩过了。

测试

minio上传成功

在这里插入图片描述

oss上传成功

在这里插入图片描述

这篇关于go语言对接S3存储的SDK(支持minio和OSS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079773

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推