Browse Source

add TencentCOS support to OSS

MUHM 4 years ago
parent
commit
43fae5f9a4

+ 9 - 0
server/config.yaml

@@ -78,6 +78,15 @@ qiniu:
   secret-key: 'pgdbqEsf7ooZh7W3xokP833h3dZ_VecFXPDeG5JY'
   use-cdn-domains: false
 
+# tencent cos configuration
+tencent-cos:
+  bucket: 'xxxxx-10005608'
+  region: 'ap-shanghai'
+  secret-id: 'xxxxxxxx'
+  secret-key: 'xxxxxxxx'
+  base-url: 'https://gin.vue.admin'
+  path-prefix: 'gin-vue-admin'
+
 # excel configuration
 excel:
   dir: './resource/excel/'

+ 1 - 0
server/config/config.go

@@ -13,5 +13,6 @@ type Server struct {
 	// oss
 	Local Local `mapstructure:"local" json:"local" yaml:"local"`
 	Qiniu Qiniu `mapstructure:"qiniu" json:"qiniu" yaml:"qiniu"`
+	TencentCOS TencentCOS `mapstructure:"tencent-cos" json:"tencentCOS" yaml:"tencent-cos"`
 	Excel Excel `mapstructure:"excel" json:"excel" yaml:"excel"`
 }

+ 9 - 0
server/config/oss.go

@@ -13,3 +13,12 @@ type Qiniu struct {
 	SecretKey     string `mapstructure:"secret-key" json:"secretKey" yaml:"secret-key"`
 	UseCdnDomains bool   `mapstructure:"use-cdn-domains" json:"useCdnDomains" yaml:"use-cdn-domains"`
 }
+
+type TencentCOS struct {
+	Bucket     string `mapstructure:"bucket" json:"bucket" yaml:"bucket"`
+	Region     string `mapstructure:"region" json:"region" yaml:"region"`
+	SecretID   string `mapstructure:"secret-id" json:"secretID" yaml:"secret-id"`
+	SecretKey  string `mapstructure:"secret-key" json:"secretKey" yaml:"secret-key"`
+	BaseURL    string `mapstructure:"base-url" json:"baseURL" yaml:"base-url"`
+	PathPrefix string `mapstructure:"path-prefix" json:"pathPrefix" yaml:"path-prefix"`
+}

+ 1 - 0
server/go.mod

@@ -46,6 +46,7 @@ require (
 	github.com/swaggo/gin-swagger v1.2.0
 	github.com/swaggo/swag v1.6.7
 	github.com/tebeka/strftime v0.1.3 // indirect
+	github.com/tencentyun/cos-go-sdk-v5 v0.7.19
 	github.com/unrolled/secure v1.0.7
 	go.uber.org/zap v1.10.0
 	golang.org/x/net v0.0.0-20201224014010-6772e930b67b // indirect

+ 60 - 0
server/utils/upload/tencent_cos.go

@@ -0,0 +1,60 @@
+package upload
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"gin-vue-admin/global"
+	"mime/multipart"
+	"net/http"
+	"net/url"
+	"time"
+
+	"github.com/tencentyun/cos-go-sdk-v5"
+	"go.uber.org/zap"
+)
+
+type TencentCOS struct{}
+
+// UploadFile upload file to COS
+func (*TencentCOS) UploadFile(file *multipart.FileHeader) (string, string, error) {
+	c := NewClient()
+	f, openError := file.Open()
+	if openError != nil {
+		global.GVA_LOG.Error("function file.Open() Filed", zap.Any("err", openError.Error()))
+
+		return "", "", errors.New("function file.Open() Filed, err:" + openError.Error())
+	}
+	fileKey := fmt.Sprintf("%d%s", time.Now().Unix(), file.Filename)
+
+	_, err := c.Object.Put(context.Background(), global.GVA_CONFIG.TencentCOS.PathPrefix+"/"+fileKey, f, nil)
+	if err != nil {
+		panic(err)
+	}
+	return global.GVA_CONFIG.TencentCOS.BaseURL + "/" + global.GVA_CONFIG.TencentCOS.PathPrefix + "/" + fileKey, fileKey, nil
+}
+
+// DeleteFile delete file form COS
+func (*TencentCOS) DeleteFile(key string) error {
+	c := NewClient()
+	name := global.GVA_CONFIG.TencentCOS.PathPrefix + "/" + key
+	_, err := c.Object.Delete(context.Background(), name)
+	if err != nil {
+		global.GVA_LOG.Error("function bucketManager.Delete() Filed", zap.Any("err", err.Error()))
+		return errors.New("function bucketManager.Delete() Filed, err:" + err.Error())
+	}
+	return nil
+}
+
+// NewClient init COS client
+func NewClient() *cos.Client {
+	u, _ := url.Parse("https://" + global.GVA_CONFIG.TencentCOS.Bucket + ".cos." + global.GVA_CONFIG.TencentCOS.Region + ".myqcloud.com")
+	b := &cos.BaseURL{BucketURL: u}
+	c := cos.NewClient(b, &http.Client{
+		Transport: &cos.AuthorizationTransport{
+			SecretID:  global.GVA_CONFIG.TencentCOS.SecretID,
+			SecretKey: global.GVA_CONFIG.TencentCOS.SecretKey,
+		},
+	})
+	return c
+}

+ 3 - 1
server/utils/upload/upload.go

@@ -28,7 +28,9 @@ func NewOss() OSS {
 		return &Local{}
 	case "qiniu":
 		return &Qiniu{}
+	case "tencent-cos":
+		return &TencentCOS{}
 	default:
 		return &Local{}
 	}
-}
+}