初始化项目框架,完成部分接口开发
This commit is contained in:
99
utility/oss/aliyun/aliyun.go
Normal file
99
utility/oss/aliyun/aliyun.go
Normal file
@ -0,0 +1,99 @@
|
||||
package aliyun
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/aliyun/aliyun-oss-go-sdk/oss"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
"github.com/gogf/gf/v2/util/grand"
|
||||
"server/internal/model"
|
||||
ioss "server/utility/oss"
|
||||
)
|
||||
|
||||
type aliyunClient struct {
|
||||
bucketName string
|
||||
key string
|
||||
secret string
|
||||
endpoint string
|
||||
}
|
||||
|
||||
// 初始化并注册
|
||||
func init() {
|
||||
ctx := context.Background()
|
||||
client := &aliyunClient{
|
||||
endpoint: g.Config().MustGet(ctx, "oss.aliyun.endpoint").String(),
|
||||
key: g.Config().MustGet(ctx, "oss.aliyun.key").String(),
|
||||
secret: g.Config().MustGet(ctx, "oss.aliyun.secret").String(),
|
||||
bucketName: g.Config().MustGet(ctx, "oss.aliyun.bucket").String(),
|
||||
}
|
||||
ioss.Register("aliyun", client)
|
||||
glog.Infof(ctx, "注册阿里云OSS成功")
|
||||
}
|
||||
|
||||
func (a *aliyunClient) client(ctx context.Context, endpoint, key, sercret string) (*oss.Client, error) {
|
||||
client, err := oss.New(endpoint, key, sercret)
|
||||
return client, err
|
||||
}
|
||||
|
||||
func (a *aliyunClient) bucket(ctx context.Context, client *oss.Client) (*oss.Bucket, error) {
|
||||
bucket, err := client.Bucket(a.bucketName)
|
||||
return bucket, err
|
||||
}
|
||||
func (a *aliyunClient) bytes(ctx context.Context, in *model.OssBytesInput) (*model.OssOutput, error) {
|
||||
client, err := a.client(ctx, a.endpoint, a.key, a.secret)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
bucket, err := a.bucket(ctx, client)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if in.Name == "" {
|
||||
in.Name = grand.Digits(32)
|
||||
}
|
||||
err = bucket.PutObject(in.Name, bytes.NewReader(in.Bytes))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &model.OssOutput{
|
||||
Url: fmt.Sprintf("https://%s.%s/%s", a.bucketName, a.endpoint, in.Name),
|
||||
}, nil
|
||||
}
|
||||
func (a *aliyunClient) UploadFile(ctx context.Context, in *model.OssUploadFileInput) (out *model.OssOutput, err error) {
|
||||
f, err := in.File.Open()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
body := make([]byte, in.File.Size)
|
||||
_, err = f.Read(body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return a.bytes(ctx, &model.OssBytesInput{
|
||||
Name: in.Filename,
|
||||
Bytes: body,
|
||||
})
|
||||
}
|
||||
func (a *aliyunClient) GetFileURL(ctx context.Context, in *model.OssGetFileInput) (out *model.OssOutput, err error) {
|
||||
client, err := a.client(ctx, a.endpoint, a.key, a.secret)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
bucket, err := a.bucket(ctx, client)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if in.Name == "" {
|
||||
in.Name = grand.Digits(32)
|
||||
}
|
||||
err = bucket.PutObjectFromFile(in.Name, in.FilePath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &model.OssOutput{
|
||||
Url: fmt.Sprintf("https://%s.%s/%s", a.bucketName, a.endpoint, in.Name),
|
||||
}, nil
|
||||
}
|
||||
26
utility/oss/oss.go
Normal file
26
utility/oss/oss.go
Normal file
@ -0,0 +1,26 @@
|
||||
package oss
|
||||
|
||||
import (
|
||||
"context"
|
||||
"server/internal/model"
|
||||
)
|
||||
|
||||
// OssClient 是所有云存储平台要实现的统一接口
|
||||
type OssClient interface {
|
||||
UploadFile(ctx context.Context, in *model.OssUploadFileInput) (out *model.OssOutput, err error)
|
||||
GetFileURL(ctx context.Context, in *model.OssGetFileInput) (out *model.OssOutput, err error)
|
||||
}
|
||||
|
||||
// registry 存储各个平台的实现
|
||||
var clients = make(map[string]OssClient)
|
||||
|
||||
// Register 用于注册平台实现
|
||||
func Register(name string, client OssClient) {
|
||||
clients[name] = client
|
||||
}
|
||||
|
||||
// GetClient 获取指定平台的实现
|
||||
func GetClient(name string) (OssClient, bool) {
|
||||
client, ok := clients[name]
|
||||
return client, ok
|
||||
}
|
||||
Reference in New Issue
Block a user