Skip to content

Commit 62c256b

Browse files
committed
上传用户头像
1 parent cb3b38f commit 62c256b

File tree

6 files changed

+90
-0
lines changed

6 files changed

+90
-0
lines changed

app/http/controllers/api/v1/users_controller.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"gohub/app/models/user"
55
"gohub/app/requests"
66
"gohub/pkg/auth"
7+
"gohub/pkg/config"
8+
"gohub/pkg/file"
79
"gohub/pkg/response"
810

911
"github.com/gin-gonic/gin"
@@ -110,3 +112,23 @@ func (ctrl *UsersController) UpdatePassword(c *gin.Context) {
110112
response.Success(c)
111113
}
112114
}
115+
116+
func (ctrl *UsersController) UpdateAvatar(c *gin.Context) {
117+
118+
request := requests.UserUpdateAvatarRequest{}
119+
if ok := requests.Validate(c, &request, requests.UserUpdateAvatar); !ok {
120+
return
121+
}
122+
123+
avatar, err := file.SaveUploadAvatar(c, request.Avatar)
124+
if err != nil {
125+
response.Abort500(c, "上传头像失败,请稍后尝试~")
126+
return
127+
}
128+
129+
currentUser := auth.CurrentUser(c)
130+
currentUser.Avatar = config.GetString("app.url") + avatar
131+
currentUser.Save()
132+
133+
response.Data(c, currentUser)
134+
}

app/requests/requests.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,14 @@ func validate(data interface{}, rules govalidator.MapData, messages govalidator.
4646
// 开始验证
4747
return govalidator.New(opts).ValidateStruct()
4848
}
49+
50+
func validateFile(c *gin.Context, data interface{}, rules govalidator.MapData, messages govalidator.MapData) map[string][]string {
51+
opts := govalidator.Options{
52+
Request: c.Request,
53+
Rules: rules,
54+
Messages: messages,
55+
TagIdentifier: "valid",
56+
}
57+
// 调用 govalidator 的 Validate 方法来验证文件
58+
return govalidator.New(opts).Validate()
59+
}

app/requests/user_request.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package requests
33
import (
44
"gohub/app/requests/validators"
55
"gohub/pkg/auth"
6+
"mime/multipart"
67

78
"github.com/gin-gonic/gin"
89
"github.com/thedevsaddam/govalidator"
@@ -155,3 +156,27 @@ func UserUpdatePassword(data interface{}, c *gin.Context) map[string][]string {
155156

156157
return errs
157158
}
159+
160+
type UserUpdateAvatarRequest struct {
161+
Avatar *multipart.FileHeader `valid:"avatar" form:"avatar"`
162+
}
163+
164+
func UserUpdateAvatar(data interface{}, c *gin.Context) map[string][]string {
165+
166+
rules := govalidator.MapData{
167+
// size 的单位为 bytes
168+
// - 1024 bytes 为 1kb
169+
// - 1048576 bytes 为 1mb
170+
// - 20971520 bytes 为 20mb
171+
"file:avatar": []string{"ext:png,jpg,jpeg", "size:20971520", "required"},
172+
}
173+
messages := govalidator.MapData{
174+
"file:avatar": []string{
175+
"ext:ext头像只能上传 png, jpg, jpeg 任意一种的图片",
176+
"size:头像文件最大不能超过 20MB",
177+
"required:必须上传图片",
178+
},
179+
}
180+
181+
return validateFile(c, data, rules, messages)
182+
}

pkg/file/file.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,17 @@
22
package file
33

44
import (
5+
"fmt"
6+
"gohub/pkg/app"
7+
"gohub/pkg/auth"
8+
"gohub/pkg/helpers"
59
"io/ioutil"
10+
"mime/multipart"
611
"os"
712
"path/filepath"
813
"strings"
14+
15+
"github.com/gin-gonic/gin"
916
)
1017

1118
// Put 将数据存入文件
@@ -27,3 +34,25 @@ func Exists(fileToCheck string) bool {
2734
func FileNameWithoutExtension(fileName string) string {
2835
return strings.TrimSuffix(fileName, filepath.Ext(fileName))
2936
}
37+
func SaveUploadAvatar(c *gin.Context, file *multipart.FileHeader) (string, error) {
38+
39+
var avatar string
40+
// 确保目录存在,不存在创建
41+
publicPath := "public"
42+
dirName := fmt.Sprintf("/uploads/avatars/%s/%s/", app.TimenowInTimezone().Format("2006/01/02"), auth.CurrentUID(c))
43+
os.MkdirAll(publicPath+dirName, 0755)
44+
45+
// 保存文件
46+
fileName := randomNameFromUploadFile(file)
47+
// public/uploads/avatars/2021/12/22/1/nFDacgaWKpWWOmOt.png
48+
avatarPath := publicPath + dirName + fileName
49+
if err := c.SaveUploadedFile(file, avatarPath); err != nil {
50+
return avatar, err
51+
}
52+
53+
return avatarPath, nil
54+
}
55+
56+
func randomNameFromUploadFile(file *multipart.FileHeader) string {
57+
return helpers.RandomString(16) + filepath.Ext(file.Filename)
58+
}

public/uploads/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*
2+
!.gitignore

routes/api.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ func RegisterAPIRoutes(r *gin.Engine) {
6363
usersGroup.PUT("/email", middlewares.AuthJWT(), uc.UpdateEmail)
6464
usersGroup.PUT("/phone", middlewares.AuthJWT(), uc.UpdatePhone)
6565
usersGroup.PUT("/password", middlewares.AuthJWT(), uc.UpdatePassword)
66+
usersGroup.PUT("/avatar", middlewares.AuthJWT(), uc.UpdateAvatar)
6667
}
6768

6869
cgc := new(controllers.CategoriesController)

0 commit comments

Comments
 (0)