feat: the upload handler for AliYun OSS is ready

This commit is contained in:
RockYang
2023-09-22 09:56:45 +08:00
parent af6f7a7146
commit e3d6e5f420
10 changed files with 170 additions and 57 deletions

View File

@@ -0,0 +1,86 @@
package oss
import (
"bytes"
"chatplus/core/types"
"chatplus/utils"
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"github.com/gin-gonic/gin"
"path/filepath"
"time"
)
type AliYunOss struct {
config *types.AliYunOssConfig
bucket *oss.Bucket
proxyURL string
}
func NewAliYunOss(appConfig *types.AppConfig) (*AliYunOss, error) {
config := &appConfig.OSS.AliYun
// 创建 OSS 客户端
client, err := oss.New(config.Endpoint, config.AccessKey, config.AccessSecret)
if err != nil {
return nil, err
}
// 获取存储空间
bucket, err := client.Bucket(config.Bucket)
if err != nil {
return nil, err
}
return &AliYunOss{
config: config,
bucket: bucket,
proxyURL: appConfig.ProxyURL,
}, nil
}
func (s AliYunOss) 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)
objectKey := fmt.Sprintf("%d%s", time.Now().UnixMicro(), fileExt)
// 上传文件
err = s.bucket.PutObject(objectKey, src)
if err != nil {
return "", err
}
return fmt.Sprintf("https://%s.%s/%s", s.config.Bucket, s.config.Endpoint, objectKey), nil
}
func (s AliYunOss) 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))
objectKey := fmt.Sprintf("%d%s", time.Now().UnixMicro(), fileExt)
// 上传文件字节数据
err = s.bucket.PutObject(objectKey, bytes.NewReader(imageData))
if err != nil {
return "", err
}
return fmt.Sprintf("https://%s.%s/%s", s.config.Bucket, s.config.Endpoint, objectKey), nil
}
func (s AliYunOss) Delete(fileURL string) error {
objectName := filepath.Base(fileURL)
return s.bucket.DeleteObject(objectName)
}
var _ Uploader = AliYunOss{}

View File

@@ -10,19 +10,19 @@ import (
"strings"
)
type LocalStorageService struct {
type LocalStorage struct {
config *types.LocalStorageConfig
proxyURL string
}
func NewLocalStorageService(config *types.AppConfig) LocalStorageService {
return LocalStorageService{
func NewLocalStorage(config *types.AppConfig) LocalStorage {
return LocalStorage{
config: &config.OSS.Local,
proxyURL: config.ProxyURL,
}
}
func (s LocalStorageService) PutFile(ctx *gin.Context, name string) (string, error) {
func (s LocalStorage) PutFile(ctx *gin.Context, name string) (string, error) {
file, err := ctx.FormFile(name)
if err != nil {
return "", fmt.Errorf("error with get form: %v", err)
@@ -41,7 +41,7 @@ func (s LocalStorageService) PutFile(ctx *gin.Context, name string) (string, err
return utils.GenUploadUrl(s.config.BasePath, s.config.BaseURL, filePath), nil
}
func (s LocalStorageService) PutImg(imageURL string) (string, error) {
func (s LocalStorage) PutImg(imageURL string) (string, error) {
filename := filepath.Base(imageURL)
filePath, err := utils.GenUploadPath(s.config.BasePath, filename)
if err != nil {
@@ -56,9 +56,9 @@ func (s LocalStorageService) PutImg(imageURL string) (string, error) {
return utils.GenUploadUrl(s.config.BasePath, s.config.BaseURL, filePath), nil
}
func (s LocalStorageService) Delete(fileURL string) error {
func (s LocalStorage) Delete(fileURL string) error {
filePath := strings.Replace(fileURL, s.config.BaseURL, s.config.BasePath, 1)
return os.Remove(filePath)
}
var _ Uploader = LocalStorageService{}
var _ Uploader = LocalStorage{}

View File

@@ -13,25 +13,25 @@ import (
"time"
)
type MinioService struct {
config *types.MinioConfig
type MiniOss struct {
config *types.MiniOssConfig
client *minio.Client
proxyURL string
}
func NewMinioService(appConfig *types.AppConfig) (MinioService, error) {
func NewMiniOss(appConfig *types.AppConfig) (MiniOss, error) {
config := &appConfig.OSS.Minio
minioClient, err := minio.New(config.Endpoint, &minio.Options{
Creds: credentials.NewStaticV4(config.AccessKey, config.AccessSecret, ""),
Secure: config.UseSSL,
})
if err != nil {
return MinioService{}, err
return MiniOss{}, err
}
return MinioService{config: config, client: minioClient, proxyURL: appConfig.ProxyURL}, nil
return MiniOss{config: config, client: minioClient, proxyURL: appConfig.ProxyURL}, nil
}
func (s MinioService) PutImg(imageURL string) (string, error) {
func (s MiniOss) PutImg(imageURL string) (string, error) {
imageData, err := utils.DownloadImage(imageURL, s.proxyURL)
if err != nil {
return "", fmt.Errorf("error with download image: %v", err)
@@ -51,7 +51,7 @@ func (s MinioService) PutImg(imageURL string) (string, error) {
return fmt.Sprintf("%s/%s/%s", s.config.Domain, s.config.Bucket, info.Key), nil
}
func (s MinioService) PutFile(ctx *gin.Context, name string) (string, error) {
func (s MiniOss) PutFile(ctx *gin.Context, name string) (string, error) {
file, err := ctx.FormFile(name)
if err != nil {
return "", fmt.Errorf("error with get form: %v", err)
@@ -75,9 +75,9 @@ func (s MinioService) PutFile(ctx *gin.Context, name string) (string, error) {
return fmt.Sprintf("%s/%s/%s", s.config.Domain, s.config.Bucket, info.Key), nil
}
func (s MinioService) Delete(fileURL string) error {
func (s MiniOss) Delete(fileURL string) error {
objectName := filepath.Base(fileURL)
return s.client.RemoveObject(context.Background(), s.config.Bucket, objectName, minio.RemoveObjectOptions{})
}
var _ Uploader = MinioService{}
var _ Uploader = MiniOss{}

View File

@@ -13,8 +13,8 @@ import (
"time"
)
type QiNiuService struct {
config *types.QiNiuConfig
type QinNiuOss struct {
config *types.QiNiuOssConfig
token string
uploader *storage.FormUploader
manager *storage.BucketManager
@@ -22,7 +22,7 @@ type QiNiuService struct {
dir string
}
func NewQiNiuService(appConfig *types.AppConfig) QiNiuService {
func NewQiNiuOss(appConfig *types.AppConfig) QinNiuOss {
config := &appConfig.OSS.QiNiu
// build storage uploader
zone, ok := storage.GetRegionByID(storage.RegionID(config.Zone))
@@ -36,7 +36,7 @@ func NewQiNiuService(appConfig *types.AppConfig) QiNiuService {
putPolicy := storage.PutPolicy{
Scope: config.Bucket,
}
return QiNiuService{
return QinNiuOss{
config: config,
token: putPolicy.UploadToken(mac),
uploader: formUploader,
@@ -46,7 +46,7 @@ func NewQiNiuService(appConfig *types.AppConfig) QiNiuService {
}
}
func (s QiNiuService) PutFile(ctx *gin.Context, name string) (string, error) {
func (s QinNiuOss) PutFile(ctx *gin.Context, name string) (string, error) {
// 解析表单
file, err := ctx.FormFile(name)
if err != nil {
@@ -72,7 +72,7 @@ func (s QiNiuService) PutFile(ctx *gin.Context, name string) (string, error) {
return fmt.Sprintf("%s/%s", s.config.Domain, ret.Key), nil
}
func (s QiNiuService) PutImg(imageURL string) (string, error) {
func (s QinNiuOss) PutImg(imageURL string) (string, error) {
imageData, err := utils.DownloadImage(imageURL, s.proxyURL)
if err != nil {
return "", fmt.Errorf("error with download image: %v", err)
@@ -89,10 +89,10 @@ func (s QiNiuService) PutImg(imageURL string) (string, error) {
return fmt.Sprintf("%s/%s", s.config.Domain, ret.Key), nil
}
func (s QiNiuService) Delete(fileURL string) error {
func (s QinNiuOss) 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{}
var _ Uploader = QinNiuOss{}

View File

@@ -12,6 +12,7 @@ type UploaderManager struct {
const Local = "LOCAL"
const Minio = "MINIO"
const QiNiu = "QINIU"
const AliYun = "ALIYUN"
func NewUploaderManager(config *types.AppConfig) (*UploaderManager, error) {
active := Local
@@ -21,17 +22,25 @@ func NewUploaderManager(config *types.AppConfig) (*UploaderManager, error) {
var handler Uploader
switch active {
case Local:
handler = NewLocalStorageService(config)
handler = NewLocalStorage(config)
break
case Minio:
service, err := NewMinioService(config)
client, err := NewMiniOss(config)
if err != nil {
return nil, err
}
handler = service
handler = client
break
case QiNiu:
handler = NewQiNiuService(config)
handler = NewQiNiuOss(config)
break
case AliYun:
client, err := NewAliYunOss(config)
if err != nil {
return nil, err
}
handler = client
break
}
return &UploaderManager{handler: handler}, nil