当前位置:   article > 正文

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

go s3 sdk

背景

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

操作

引入

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
  • 1
  • 2
  • 3
  • 4

代码实现

工具类

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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

调用

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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

我这里的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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

遇到的问题点

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

测试

minio上传成功

在这里插入图片描述

oss上传成功

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/883334
推荐阅读
  

闽ICP备14008679号