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 }