-
Notifications
You must be signed in to change notification settings - Fork 14
/
oss.go
executable file
·118 lines (106 loc) · 2.5 KB
/
oss.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package oss
import (
"errors"
"github.com/beego/beemod/pkg/datasource"
"github.com/beego/beemod/pkg/module"
"github.com/beego/beemod/pkg/oss/alioss"
"github.com/beego/beemod/pkg/oss/file"
"github.com/beego/beemod/pkg/oss/standard"
"github.com/satori/uuid"
"strings"
"sync"
"time"
)
var defaultInvoker = &descriptor{
Name: module.OssName,
Key: module.ConfigPrefix + module.OssName,
}
type descriptor struct {
Name string
Key string
store sync.Map
cfg map[string]InvokerCfg
}
type Client struct {
standard.Oss
cfg InvokerCfg
}
// default invoker build
func DefaultBuild() module.Invoker {
return defaultInvoker
}
// invoker
func Invoker(name string) *Client {
obj, ok := defaultInvoker.store.Load(name)
if !ok {
return nil
}
return obj.(*Client)
}
func (c *descriptor) InitCfg(ds datasource.Datasource) error {
c.cfg = make(map[string]InvokerCfg, 0)
ds.Range(c.Key, func(key string, name string) bool {
config := DefaultInvokerCfg
if err := ds.Unmarshal(key, &config); err != nil {
return false
}
c.cfg[name] = config
return true
})
return nil
}
func (c *descriptor) Run() error {
for name, cfg := range c.cfg {
db, err := provider(cfg)
if err != nil {
return err
}
c := &Client{
db,
cfg,
}
defaultInvoker.store.Store(name, c)
}
return nil
}
func provider(cfg InvokerCfg) (client standard.Oss, err error) {
if cfg.Mode == "alioss" {
client, err = alioss.NewOss(cfg.Addr, cfg.AccessKeyID, cfg.AccessKeySecret, cfg.OssBucket, cfg.IsDeleteSrcPath)
} else if cfg.Mode == "file" {
client, err = file.NewOss(cfg.CdnName, cfg.FileBucket, cfg.IsDeleteSrcPath)
} else {
err = errors.New("oss mode not exist")
return
}
return
}
func (c *Client) ShowImg(img string, style ...string) (url string) {
if strings.HasPrefix(img, "https://") || strings.HasPrefix(img, "http://") {
return img
}
img = strings.TrimLeft(img, "./")
switch c.cfg.Mode {
case "alioss":
s := ""
if len(style) > 0 && strings.TrimSpace(style[0]) != "" {
s = "/" + style[0]
}
url = img + s
case "file":
url = img
}
url = c.cfg.CdnName + url
return
}
func (c *Client) ShowImgArr(imgs []string, style ...string) (urlArr []string) {
urlArr = make([]string, 0)
for _, img := range imgs {
urlArr = append(urlArr, c.ShowImg(img, style...))
}
return
}
func (c *Client) GenerateKey(prefix string) string {
month := time.Now().Format("200601")
// object路径开头不能与“/”
return prefix + "/" + month + "/" + strings.ReplaceAll(uuid.NewV4().String(), "-", "") + ".jpg"
}