forked from mygomod/muses
-
Notifications
You must be signed in to change notification settings - Fork 0
/
oss.go
executable file
·110 lines (98 loc) · 2.3 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
package oss
import (
"errors"
"github.com/BurntSushi/toml"
"github.com/pinke/muses/pkg/common"
"github.com/pinke/muses/pkg/oss/alioss"
"github.com/pinke/muses/pkg/oss/file"
"github.com/pinke/muses/pkg/oss/standard"
"github.com/satori/uuid"
"strings"
"sync"
"time"
)
var defaultCaller = &callerStore{
Name: common.ModOssName,
}
type callerStore struct {
Name string
IsBackground bool
caller sync.Map
cfg Cfg
}
type Client struct {
standard.Oss
cfg CallerCfg
}
func Register() common.Caller {
return defaultCaller
}
func Caller(name string) *Client {
obj, ok := defaultCaller.caller.Load(name)
if !ok {
return nil
}
return obj.(*Client)
}
func (c *callerStore) InitCfg(cfg []byte) error {
if err := toml.Unmarshal(cfg, &c.cfg); err != nil {
return err
}
return nil
}
func (c *callerStore) InitCaller() error {
for name, cfg := range c.cfg.Muses.Oss {
db, err := provider(cfg)
if err != nil {
return err
}
c := &Client{
db,
cfg,
}
defaultCaller.caller.Store(name, c)
}
return nil
}
func provider(cfg CallerCfg) (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")
// Reossv2上传报错:Thespecifiedobjectisnotvalid.
// object路径开头不能与“/”
return prefix + "/" + month + "/" + strings.ReplaceAll(uuid.NewV4().String(), "-", "") + ".jpg"
}