98 lines
2.5 KiB
Go
98 lines
2.5 KiB
Go
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/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)
|
|
}
|
|
|
|
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
|
|
}
|