feat: add QiNiu OSS storage implements

This commit is contained in:
RockYang
2023-09-06 14:37:13 +08:00
parent fac7eb61b3
commit 2f318bbe9f
10 changed files with 194 additions and 36 deletions

View File

@@ -0,0 +1,98 @@
package oss
import (
"bytes"
"chatplus/core/types"
"chatplus/utils"
"context"
"fmt"
"github.com/gin-gonic/gin"
"github.com/qiniu/go-sdk/v7/auth/qbox"
"github.com/qiniu/go-sdk/v7/storage"
"path/filepath"
"time"
)
type QiNiuService struct {
config *types.QiNiuConfig
token string
uploader *storage.FormUploader
manager *storage.BucketManager
proxyURL string
dir string
}
func NewQiNiuService(appConfig *types.AppConfig) QiNiuService {
config := &appConfig.OSS.QiNiu
// build storage uploader
zone, ok := storage.GetRegionByID(storage.RegionID(config.Zone))
if !ok {
zone = storage.ZoneHuanan
}
storeConfig := storage.Config{Zone: &zone}
formUploader := storage.NewFormUploader(&storeConfig)
// generate token
mac := qbox.NewMac(config.AccessKey, config.AccessSecret)
putPolicy := storage.PutPolicy{
Scope: config.Bucket,
}
return QiNiuService{
config: config,
token: putPolicy.UploadToken(mac),
uploader: formUploader,
manager: storage.NewBucketManager(mac, &storeConfig),
proxyURL: appConfig.ProxyURL,
dir: "chatgpt-plus",
}
}
func (s QiNiuService) PutFile(ctx *gin.Context, name string) (string, error) {
// 解析表单
file, err := ctx.FormFile(name)
if err != nil {
return "", err
}
// 打开上传文件
src, err := file.Open()
if err != nil {
return "", err
}
defer src.Close()
fileExt := filepath.Ext(file.Filename)
key := fmt.Sprintf("%s/%d%s", s.dir, time.Now().UnixMicro(), fileExt)
// 上传文件
ret := storage.PutRet{}
extra := storage.PutExtra{}
err = s.uploader.Put(ctx, &ret, s.token, key, src, file.Size, &extra)
if err != nil {
return "", err
}
return fmt.Sprintf("%s/%s", s.config.Domain, ret.Key), nil
}
func (s QiNiuService) PutImg(imageURL string) (string, error) {
imageData, err := utils.DownloadImage(imageURL, s.proxyURL)
if err != nil {
return "", fmt.Errorf("error with download image: %v", err)
}
fileExt := filepath.Ext(filepath.Base(imageURL))
key := fmt.Sprintf("%s/%d%s", s.dir, time.Now().UnixMicro(), fileExt)
ret := storage.PutRet{}
extra := storage.PutExtra{}
// 上传文件字节数据
err = s.uploader.Put(context.Background(), &ret, s.token, key, bytes.NewReader(imageData), int64(len(imageData)), &extra)
if err != nil {
return "", err
}
return fmt.Sprintf("%s/%s", s.config.Domain, ret.Key), nil
}
func (s QiNiuService) Delete(fileURL string) error {
objectName := filepath.Base(fileURL)
key := fmt.Sprintf("%s/%s", s.dir, objectName)
return s.manager.Delete(s.config.Bucket, key)
}
var _ Uploader = QiNiuService{}

View File

@@ -10,8 +10,9 @@ type UploaderManager struct {
uploadServices map[string]Uploader
}
const uploaderLocal = "LOCAL"
const uploaderMinio = "MINIO"
const Local = "LOCAL"
const Minio = "MINIO"
const QiNiu = "QINIU"
func NewUploaderManager(config *types.AppConfig) (*UploaderManager, error) {
services := make(map[string]Uploader)
@@ -20,12 +21,15 @@ func NewUploaderManager(config *types.AppConfig) (*UploaderManager, error) {
if err != nil {
return nil, err
}
services[uploaderMinio] = minioService
services[Minio] = minioService
}
if config.OSS.Local.BasePath != "" {
services[uploaderLocal] = NewLocalStorageService(config)
services[Local] = NewLocalStorageService(config)
}
active := uploaderLocal
if config.OSS.QiNiu.AccessKey != "" {
services[QiNiu] = NewQiNiuService(config)
}
active := Local
if config.OSS.Active != "" {
active = strings.ToUpper(config.OSS.Active)
}