8
8
"io"
9
9
"os"
10
10
"path"
11
- "path/filepath"
12
11
"strings"
13
12
"time"
14
13
@@ -45,45 +44,47 @@ func (f FileHandler) Upload(c echo.Context) error {
45
44
var (
46
45
result []string
47
46
)
47
+
48
48
form , err := c .MultipartForm ()
49
49
if err != nil {
50
50
f .base .log .Error ().Msgf ("读取上传图片异常:%s" , err )
51
51
return FailRespWithMsg (c , Fail , "上传图片异常" )
52
52
}
53
- files := form .File ["files" ]
54
53
54
+ if err := os .MkdirAll (f .base .cfg .UploadDir , 0755 ); err != nil {
55
+ f .base .log .Error ().Msgf ("创建父级目录异常:%s" , err )
56
+ return FailRespWithMsg (c , Fail , "创建父级目录异常" )
57
+ }
58
+
59
+ files := form .File ["files" ]
55
60
for _ , file := range files {
56
- // Source
61
+ // 原始图片
57
62
src , err := file .Open ()
58
63
if err != nil {
59
64
f .base .log .Error ().Msgf ("打开上传图片异常:%s" , err )
60
65
return FailRespWithMsg (c , Fail , "上传图片异常" )
61
66
}
62
67
defer src .Close ()
63
- // Destination
68
+
69
+ // 创建原始图片
64
70
img_filename := strings .ReplaceAll (uuid .NewString (), "-" , "" )
65
71
img_filepath := path .Join (f .base .cfg .UploadDir , img_filename )
66
-
67
- thumb_filename := img_filename + "_thumb"
68
- thumb_filepath := path .Join (f .base .cfg .UploadDir , thumb_filename )
69
-
70
- if err := os .MkdirAll (filepath .Dir (img_filepath ), 0755 ); err != nil {
71
- f .base .log .Error ().Msgf ("创建父级目录异常:%s" , err )
72
- return FailRespWithMsg (c , Fail , "创建父级目录异常" )
73
- }
74
72
dst , err := os .Create (img_filepath )
75
73
if err != nil {
76
74
f .base .log .Error ().Msgf ("打开目标图片异常:%s" , err )
77
75
return FailRespWithMsg (c , Fail , "上传图片异常" )
78
76
}
79
77
defer dst .Close ()
80
- // Copy
78
+
79
+ // 保存图片
81
80
if _ , err = io .Copy (dst , src ); err != nil {
82
81
f .base .log .Error ().Msgf ("复制图片异常:%s" , err )
83
82
return FailRespWithMsg (c , Fail , "上传图片异常" )
84
83
}
85
84
86
- // compress image
85
+ // 生成并保存缩略图
86
+ thumb_filename := img_filename + "_thumb"
87
+ thumb_filepath := path .Join (f .base .cfg .UploadDir , thumb_filename )
87
88
if err := CompressImage (f , img_filepath , thumb_filepath , 30 ); err != nil {
88
89
f .base .log .Error ().Msgf ("压缩图片异常:%s" , err )
89
90
}
@@ -113,7 +114,6 @@ type s3PresignedResp struct {
113
114
// @Success 200 {object} s3PresignedResp
114
115
// @Router /api/file/s3PreSigned [post]
115
116
func (f FileHandler ) S3PreSigned (c echo.Context ) error {
116
-
117
117
var (
118
118
req PreSignedReq
119
119
sysConfig db.SysConfig
@@ -126,15 +126,30 @@ func (f FileHandler) S3PreSigned(c echo.Context) error {
126
126
if err := f .base .db .First (& sysConfig ).Error ; errors .Is (err , gorm .ErrRecordNotFound ) {
127
127
return FailResp (c , Fail )
128
128
}
129
+
129
130
if err := json .Unmarshal ([]byte (sysConfig .Content ), & sysConfigVo ); err != nil {
130
131
f .base .log .Error ().Msgf ("无法反序列化系统配置, %s" , err )
131
132
return FailRespWithMsg (c , Fail , err .Error ())
132
133
}
133
- cfg , err := config .LoadDefaultConfig (context .TODO (), config .WithRegion (sysConfigVo .S3 .Region ),
134
- config .WithEndpointResolver (aws .EndpointResolverFunc (func (service , region string ) (aws.Endpoint , error ) {
135
- return aws.Endpoint {URL : sysConfigVo .S3 .Endpoint }, nil
136
- })),
137
- config .WithCredentialsProvider (credentials .NewStaticCredentialsProvider (sysConfigVo .S3 .AccessKey , sysConfigVo .S3 .SecretKey , "" )))
134
+
135
+ cfg , err := config .LoadDefaultConfig (
136
+ context .TODO (),
137
+ config .WithRegion (sysConfigVo .S3 .Region ),
138
+ config .WithEndpointResolver (
139
+ aws .EndpointResolverFunc (
140
+ func (service , region string ) (aws.Endpoint , error ) {
141
+ return aws.Endpoint {URL : sysConfigVo .S3 .Endpoint }, nil
142
+ },
143
+ ),
144
+ ),
145
+ config .WithCredentialsProvider (
146
+ credentials .NewStaticCredentialsProvider (
147
+ sysConfigVo .S3 .AccessKey ,
148
+ sysConfigVo .S3 .SecretKey ,
149
+ "" ,
150
+ ),
151
+ ),
152
+ )
138
153
if err != nil {
139
154
f .base .log .Error ().Msgf ("无法加载SDK配置, %s" , err )
140
155
return FailRespWithMsg (c , Fail , err .Error ())
@@ -143,22 +158,33 @@ func (f FileHandler) S3PreSigned(c echo.Context) error {
143
158
client := s3 .NewFromConfig (cfg )
144
159
presignedClient := s3 .NewPresignClient (client )
145
160
146
- key := fmt .Sprintf ("moments/%s/%s" , time .Now ().Format ("2006/01/02" ), strings .ReplaceAll (uuid .NewString (), "-" , "" ))
147
- presignedResult , err := presignedClient .PresignPutObject (context .TODO (), & s3.PutObjectInput {
148
- Bucket : aws .String (sysConfigVo .S3 .Bucket ),
149
- Key : aws .String (key ),
150
- ContentType : aws .String (req .ContentType ),
151
- }, func (opts * s3.PresignOptions ) {
152
- opts .Expires = time .Minute * 5
153
- })
161
+ key := fmt .Sprintf (
162
+ "moments/%s/%s" ,
163
+ time .Now ().Format ("2006/01/02" ),
164
+ strings .ReplaceAll (uuid .NewString (), "-" , "" ),
165
+ )
166
+ presignedResult , err := presignedClient .PresignPutObject (
167
+ context .TODO (),
168
+ & s3.PutObjectInput {
169
+ Bucket : aws .String (sysConfigVo .S3 .Bucket ),
170
+ Key : aws .String (key ),
171
+ ContentType : aws .String (req .ContentType ),
172
+ },
173
+ func (opts * s3.PresignOptions ) {
174
+ opts .Expires = time .Minute * 5
175
+ },
176
+ )
154
177
155
178
if err != nil {
156
179
f .base .log .Error ().Msgf ("无法获取预签名URL, %s" , err )
157
180
return FailRespWithMsg (c , Fail , fmt .Sprintf ("无法获取预签名URL, %s" , err ))
158
181
}
159
182
160
- return SuccessResp (c , s3PresignedResp {
161
- PreSignedUrl : presignedResult .URL ,
162
- ImageUrl : fmt .Sprintf ("%s/%s" , sysConfigVo .S3 .Domain , key ),
163
- })
183
+ return SuccessResp (
184
+ c ,
185
+ s3PresignedResp {
186
+ PreSignedUrl : presignedResult .URL ,
187
+ ImageUrl : fmt .Sprintf ("%s/%s" , sysConfigVo .S3 .Domain , key ),
188
+ },
189
+ )
164
190
}
0 commit comments