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.0
	github.com/aws/aws-sdk-go-v2/config v1.27.21
	github.com/aws/aws-sdk-go-v2/credentials v1.17.21
	github.com/aws/aws-sdk-go-v2/service/s3 v1.56.1

代码实现

工具类

type S3Client struct {
	endpoint        string
	accessKeyId     string
	accessKeySecret string
	client          *s3.Client
	bucket          string
	region          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 = bucket
	if 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上传成功

在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MinIOOSS是两个不同的对象存储服务。 1. MinIO是一种开源的对象存储服务器,它兼容Amazon S3 API。MinIO提供了一个简单、高性能、分布式的存储解决方案,可以在私有云或公有云环境中使用。它具有强大的可扩展性和高可用性,并且支持数据加密、存储桶策略等功能,可用于构建各种应用程序。 2. OSS(Object Storage Service)是阿里云提供的一种云端存储服务。它提供了一个高度可扩展、安全可靠的对象存储解决方案,可以用于存储和访问各种类型的数据,如图片、视频、文档等。OSS支持多种数据管理功能,如访问控制、数据备份和恢复、数据迁移等。 在功能上,MinIOOSS都提供了对象存储的基本功能,包括上传、下载、删除、管理存储桶等。然而,它们之间也存在一些区别: - 开源性质:MinIO是开源软件,用户可以自由获取和修改源代码,以满足特定需求。而OSS是阿里云的商业产品,用户需要购买相应的服务来使用。 - 部署方式:MinIO可以在私有云或公有云环境中自行部署和管理。而OSS是基于阿里云平台的托管服务,用户只需要使用API调用来进行操作。 - 可扩展性:MinIO可以通过添加更多的节点来实现横向扩展,以满足不断增长的存储需求。OSS提供了大规模的存储容量和并发处理能力,可以适应各种规模的业务需求。 综上所述,选择使用MinIO还是OSS取决于具体需求和使用场景。如果你需要自己控制和管理存储环境,并且希望灵活定制存储解决方案,那么MinIO可能更适合。如果你希望无需关心底层架构和维护工作,快速搭建存储服务并具备高可用性和可靠性,那么OSS可能更合适。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚开发小咸鱼

原创不宜,请作者喝杯咖啡吧。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值