-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwatermark_cache.go
More file actions
92 lines (82 loc) · 2.34 KB
/
watermark_cache.go
File metadata and controls
92 lines (82 loc) · 2.34 KB
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
package image
import (
"io"
"sync"
"github.com/admpub/errors"
godl "github.com/admpub/go-download/v2"
_ "golang.org/x/image/webp"
)
var (
cachedWatermarkFileData = sync.Map{}
cachedWatermarkFileIndex = []string{}
cachedWatermarkFileMax = 10
)
func SetCachedWatermarkFileMax(n int) {
cachedWatermarkFileMax = n
}
func DeleteCachedWatermarkFileData(keys ...string) {
for _, key := range keys {
cachedWatermarkFileData.Delete(key)
for i, k := range cachedWatermarkFileIndex {
if key != k {
continue
}
endIndex := len(cachedWatermarkFileIndex) - 1
if endIndex == i {
cachedWatermarkFileIndex = cachedWatermarkFileIndex[0:endIndex]
break
}
if i == 0 {
cachedWatermarkFileIndex = cachedWatermarkFileIndex[1:]
} else {
cachedWatermarkFileIndex = append(cachedWatermarkFileIndex[0:i], cachedWatermarkFileIndex[i+1:]...)
}
break
}
}
}
func ClearCachedWatermarkFileData() {
cachedWatermarkFileData.Range(func(key, _ interface{}) bool {
cachedWatermarkFileData.Delete(key)
return true
})
cachedWatermarkFileIndex = []string{}
}
func StoreCachedWatermarkFileData(key string, value interface{}) {
if len(cachedWatermarkFileIndex)+1 > cachedWatermarkFileMax {
DeleteCachedWatermarkFileData(cachedWatermarkFileIndex[len(cachedWatermarkFileIndex)-1])
}
cachedWatermarkFileData.Store(key, value)
cachedWatermarkFileIndex = append(cachedWatermarkFileIndex, key)
}
func LoadCachedWatermarkFileData(key string) (value interface{}, ok bool) {
return cachedWatermarkFileData.Load(key)
}
// GetRemoteWatermarkFileData 获取远程水印图片文件数据
func GetRemoteWatermarkFileData(fileURL string) (FileReader, error) {
value, ok := LoadCachedWatermarkFileData(fileURL)
if ok {
if f, y := value.(*WatermarkData); y {
return Bytes2file(f.Data), nil
}
}
b, err := ReadRemoteWatermarkFile(fileURL)
if err != nil {
return nil, err
}
StoreCachedWatermarkFileData(fileURL, NewWatermarkData(b))
return Bytes2file(b), err
}
// ReadRemoteWatermarkFile 读取远程水印图片文件
func ReadRemoteWatermarkFile(fileURL string) ([]byte, error) {
file, err := godl.Open(fileURL, DefaultWatermarkFileDownloadOptions)
if err != nil {
return nil, errors.WithMessage(err, fileURL)
}
defer file.Close()
b, err := io.ReadAll(file)
if err != nil {
return nil, errors.WithMessage(err, fileURL)
}
return b, err
}