背景
在某个项目中,客户要求支持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上传文件遇到的问题
里面有说具体的问题点、原因。
当然如果按照我上述配置的话,不会存在问题。
坑的话我已经踩过了。