完善功能

This commit is contained in:
2025-07-16 15:16:40 +08:00
parent b2871ec0d2
commit f68a5b360b
123 changed files with 4643 additions and 931 deletions

View File

@ -1,99 +0,0 @@
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
}

View File

@ -0,0 +1,114 @@
package amazons3
import (
"bytes"
"server/utility/oss"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"github.com/gogf/gf/crypto/gmd5"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/os/gfile"
"github.com/gogf/gf/os/glog"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/util/grand"
)
type AmazonS3Client struct{}
func (c *AmazonS3Client) initSess() (*session.Session, error) {
key := g.Config().GetString("aws.s3.key")
secret := g.Config().GetString("aws.s3.secret")
region := g.Config().GetString("aws.s3.region")
if len(key) == 0 || len(secret) == 0 {
return nil, gerror.New("aws s3 配置错误")
}
config := &aws.Config{
Region: aws.String(region),
Credentials: credentials.NewStaticCredentials(key, secret, ""),
}
sess := session.Must(session.NewSession(config))
return sess, nil
}
func (c *AmazonS3Client) Upload(file interface{}) (string, error) {
uploadFile, ok := file.(*ghttp.UploadFile)
if !ok {
return "", gerror.New("参数类型错误")
}
bucket := g.Config().GetString("aws.s3.bucket")
if len(bucket) == 0 {
glog.Warning("bucket为空:", bucket)
return "", gerror.New("aws s3 配置错误")
}
sess, err := c.initSess()
if err != nil {
return "", err
}
uploader := s3manager.NewUploader(sess)
f, err := uploadFile.Open()
if err != nil {
return "", err
}
defer f.Close()
body := make([]byte, uploadFile.Size)
_, err = f.Read(body)
if err != nil {
return "", err
}
key, err := gmd5.Encrypt(uploadFile.Filename + gtime.Datetime() + grand.Digits(6))
ext := gfile.Ext(uploadFile.Filename)
if err != nil {
return "", err
}
r, err := uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String(bucket),
Key: aws.String(key + ext),
Body: bytes.NewReader(body),
})
if err != nil {
return "", err
}
return r.Location, nil
}
func (c *AmazonS3Client) UploadLocalFile(path, name string) (string, error) {
bucket := g.Config().GetString("aws.s3.bucket")
if len(bucket) == 0 {
glog.Warning("bucket为空:", bucket)
return "", gerror.New("aws s3 配置错误")
}
sess, err := c.initSess()
if err != nil {
return "", err
}
uploader := s3manager.NewUploader(sess)
f, err := gfile.Open(path)
if err != nil {
return "", err
}
defer f.Close()
body := make([]byte, gfile.Size(path))
_, err = f.Read(body)
if err != nil {
return "", err
}
r, err := uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String(bucket),
Key: aws.String(name),
Body: bytes.NewReader(body),
})
if err != nil {
glog.Debug(err)
return "", err
}
return r.Location, nil
}
func init() {
oss.RegisterClient("amazon_s3", &AmazonS3Client{})
}

View File

@ -1,26 +1,16 @@
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)
type OSSClient interface {
Upload(file interface{}) (string, error)
UploadLocalFile(path, name string) (string, error)
}
// registry 存储各个平台的实现
var clients = make(map[string]OssClient)
var clients = make(map[string]OSSClient)
// Register 用于注册平台实现
func Register(name string, client OssClient) {
func RegisterClient(name string, client OSSClient) {
clients[name] = client
}
// GetClient 获取指定平台的实现
func GetClient(name string) (OssClient, bool) {
client, ok := clients[name]
return client, ok
func GetOSSClient(name string) OSSClient {
return clients[name]
}