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