/
file.go
104 lines (85 loc) · 1.84 KB
/
file.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
package util
import (
"context"
"crypto/md5"
"fmt"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/iimeta/iim-client/utility/logger"
"image"
"io/fs"
"os"
)
type ImageInfo struct {
Md5Sum string
FilePath string
Size int
Width int
Height int
}
func SaveImage(ctx context.Context, imgBytes []byte, ext string, fileName ...string) (*ImageInfo, error) {
basePath := fmt.Sprintf("public/media/image/talk/%s", DateNumber())
err := os.MkdirAll("./resource/"+basePath, fs.ModePerm)
if err != nil {
logger.Error(ctx, err)
return nil, err
}
md5Sum := fmt.Sprintf("%x", md5.Sum(imgBytes))
var filePath string
if len(fileName) > 0 {
filePath = fmt.Sprintf("%s/%s", basePath, fileName[0])
} else {
filePath = fmt.Sprintf("%s/%s%s", basePath, md5Sum, ext)
}
file, err := os.Create("./resource/" + filePath)
if err != nil {
logger.Error(ctx, err)
return nil, err
}
defer func() {
err = file.Close()
if err != nil {
logger.Error(ctx, err)
}
}()
size, err := file.Write(imgBytes)
if err != nil {
logger.Error(ctx, err)
return nil, err
}
width := 512
height := 512
if ext != ".webp" {
reader, err := os.Open("./resource/" + filePath)
if err != nil {
logger.Error(ctx, err)
} else {
defer func() {
err := reader.Close()
if err != nil {
logger.Error(ctx, err)
}
}()
img, _, err := image.Decode(reader)
if err != nil {
logger.Error(ctx, err)
return nil, err
}
bounds := img.Bounds()
if bounds.Dx() != 0 {
width = bounds.Dx()
}
if bounds.Dy() != 0 {
height = bounds.Dy()
}
}
}
imageInfo := &ImageInfo{
Md5Sum: md5Sum,
FilePath: filePath,
Size: size,
Width: width,
Height: height,
}
logger.Infof(ctx, "SaveImage imageInfo: %s, size: %d", gjson.MustEncodeString(imageInfo), imageInfo.Size)
return imageInfo, nil
}