feat: delete the old avatar image file when update the user profile

This commit is contained in:
RockYang 2023-08-21 06:27:30 +08:00
parent 46f96e94ec
commit dec0d0dea7
7 changed files with 52 additions and 16 deletions

View File

@ -35,6 +35,13 @@ func NewDefaultConfig() *types.AppConfig {
}, },
ApiConfig: types.ChatPlusApiConfig{}, ApiConfig: types.ChatPlusApiConfig{},
ExtConfig: types.ChatPlusExtConfig{Token: utils.RandString(32)}, ExtConfig: types.ChatPlusExtConfig{Token: utils.RandString(32)},
OSS: types.OSSConfig{
Active: "local",
Local: types.LocalStorageConfig{
BaseURL: "http://localhost/5678/static/upload",
BasePath: "./static/upload",
},
},
} }
} }

View File

@ -22,7 +22,7 @@ func NewUploadHandler(app *core.AppServer, db *gorm.DB, manager *oss.UploaderMan
} }
func (h *UploadHandler) Upload(c *gin.Context) { func (h *UploadHandler) Upload(c *gin.Context) {
fileURL, err := h.uploaderManager.GetActiveService().PutFile(c) fileURL, err := h.uploaderManager.GetActiveService().PutFile(c, "file")
if err != nil { if err != nil {
resp.ERROR(c, fmt.Sprintf("文件上传失败: %s", err.Error())) resp.ERROR(c, fmt.Sprintf("文件上传失败: %s", err.Error()))
return return

View File

@ -3,6 +3,7 @@ package handler
import ( import (
"chatplus/core" "chatplus/core"
"chatplus/core/types" "chatplus/core/types"
"chatplus/service/oss"
"chatplus/store" "chatplus/store"
"chatplus/store/model" "chatplus/store/model"
"chatplus/store/vo" "chatplus/store/vo"
@ -20,13 +21,19 @@ import (
type UserHandler struct { type UserHandler struct {
BaseHandler BaseHandler
db *gorm.DB db *gorm.DB
searcher *xdb.Searcher searcher *xdb.Searcher
leveldb *store.LevelDB leveldb *store.LevelDB
uploadManager *oss.UploaderManager
} }
func NewUserHandler(app *core.AppServer, db *gorm.DB, searcher *xdb.Searcher, levelDB *store.LevelDB) *UserHandler { func NewUserHandler(
handler := &UserHandler{db: db, searcher: searcher, leveldb: levelDB} app *core.AppServer,
db *gorm.DB,
searcher *xdb.Searcher,
levelDB *store.LevelDB,
manager *oss.UploaderManager) *UserHandler {
handler := &UserHandler{db: db, searcher: searcher, leveldb: levelDB, uploadManager: manager}
handler.App = app handler.App = app
return handler return handler
} }
@ -256,6 +263,7 @@ func (h *UserHandler) ProfileUpdate(c *gin.Context) {
} }
h.db.First(&user, user.Id) h.db.First(&user, user.Id)
user.Nickname = data.Nickname user.Nickname = data.Nickname
oldAvatar := user.Avatar
user.Avatar = data.Avatar user.Avatar = data.Avatar
var chatConfig types.ChatConfig var chatConfig types.ChatConfig
@ -278,6 +286,14 @@ func (h *UserHandler) ProfileUpdate(c *gin.Context) {
resp.ERROR(c, "更新用户信息失败") resp.ERROR(c, "更新用户信息失败")
return return
} }
// remove the old avatar image file
if oldAvatar != data.Avatar {
err = h.uploadManager.GetActiveService().Delete(oldAvatar)
if err != nil {
logger.Error("error with delete image: ", err)
}
}
resp.SUCCESS(c) resp.SUCCESS(c)
} }

View File

@ -5,7 +5,9 @@ import (
"chatplus/utils" "chatplus/utils"
"fmt" "fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"os"
"path/filepath" "path/filepath"
"strings"
) )
type LocalStorageService struct { type LocalStorageService struct {
@ -20,8 +22,8 @@ func NewLocalStorageService(config *types.AppConfig) LocalStorageService {
} }
} }
func (s LocalStorageService) PutFile(ctx *gin.Context) (string, error) { func (s LocalStorageService) PutFile(ctx *gin.Context, name string) (string, error) {
file, err := ctx.FormFile("file") file, err := ctx.FormFile(name)
if err != nil { if err != nil {
return "", fmt.Errorf("error with get form: %v", err) return "", fmt.Errorf("error with get form: %v", err)
} }
@ -54,4 +56,9 @@ func (s LocalStorageService) PutImg(imageURL string) (string, error) {
return utils.GenUploadUrl(s.config.BasePath, s.config.BaseURL, filePath), nil return utils.GenUploadUrl(s.config.BasePath, s.config.BaseURL, filePath), nil
} }
func (s LocalStorageService) Delete(fileURL string) error {
filePath := strings.Replace(fileURL, s.config.BaseURL, s.config.BasePath, 1)
return os.Remove(filePath)
}
var _ Uploader = LocalStorageService{} var _ Uploader = LocalStorageService{}

View File

@ -37,7 +37,7 @@ func (s MinioService) PutImg(imageURL string) (string, error) {
return "", fmt.Errorf("error with download image: %v", err) return "", fmt.Errorf("error with download image: %v", err)
} }
fileExt := filepath.Ext(filepath.Base(imageURL)) fileExt := filepath.Ext(filepath.Base(imageURL))
filename := fmt.Sprintf("%d%s", time.Now().UnixNano(), fileExt) filename := fmt.Sprintf("%d%s", time.Now().UnixMicro(), fileExt)
info, err := s.client.PutObject( info, err := s.client.PutObject(
context.Background(), context.Background(),
s.config.Bucket, s.config.Bucket,
@ -51,8 +51,8 @@ func (s MinioService) PutImg(imageURL string) (string, error) {
return fmt.Sprintf("%s/%s/%s", s.config.Domain, s.config.Bucket, info.Key), nil return fmt.Sprintf("%s/%s/%s", s.config.Domain, s.config.Bucket, info.Key), nil
} }
func (s MinioService) PutFile(ctx *gin.Context) (string, error) { func (s MinioService) PutFile(ctx *gin.Context, name string) (string, error) {
file, err := ctx.FormFile("file") file, err := ctx.FormFile(name)
if err != nil { if err != nil {
return "", fmt.Errorf("error with get form: %v", err) return "", fmt.Errorf("error with get form: %v", err)
} }
@ -64,7 +64,7 @@ func (s MinioService) PutFile(ctx *gin.Context) (string, error) {
defer fileReader.Close() defer fileReader.Close()
fileExt := filepath.Ext(file.Filename) fileExt := filepath.Ext(file.Filename)
filename := fmt.Sprintf("%d%s", time.Now().UnixNano(), fileExt) filename := fmt.Sprintf("%d%s", time.Now().UnixMicro(), fileExt)
info, err := s.client.PutObject(ctx, s.config.Bucket, filename, fileReader, file.Size, minio.PutObjectOptions{ info, err := s.client.PutObject(ctx, s.config.Bucket, filename, fileReader, file.Size, minio.PutObjectOptions{
ContentType: file.Header.Get("Content-Type"), ContentType: file.Header.Get("Content-Type"),
}) })
@ -75,4 +75,9 @@ func (s MinioService) PutFile(ctx *gin.Context) (string, error) {
return fmt.Sprintf("%s/%s/%s", s.config.Domain, s.config.Bucket, info.Key), nil return fmt.Sprintf("%s/%s/%s", s.config.Domain, s.config.Bucket, info.Key), nil
} }
func (s MinioService) Delete(fileURL string) error {
objectName := filepath.Base(fileURL)
return s.client.RemoveObject(context.Background(), s.config.Bucket, objectName, minio.RemoveObjectOptions{})
}
var _ Uploader = MinioService{} var _ Uploader = MinioService{}

View File

@ -3,6 +3,7 @@ package oss
import "github.com/gin-gonic/gin" import "github.com/gin-gonic/gin"
type Uploader interface { type Uploader interface {
PutFile(ctx *gin.Context) (string, error) PutFile(ctx *gin.Context, name string) (string, error)
PutImg(imageURL string) (string, error) PutImg(imageURL string) (string, error)
Delete(fileURL string) error
} }

View File

@ -14,16 +14,16 @@ import (
// GenUploadPath 生成上传文件路径 // GenUploadPath 生成上传文件路径
func GenUploadPath(basePath, filename string) (string, error) { func GenUploadPath(basePath, filename string) (string, error) {
now := time.Now() now := time.Now()
dir := fmt.Sprintf("%s/upload/%d/%d", basePath, now.Year(), now.Month()) dir := fmt.Sprintf("%s/%d/%d", basePath, now.Year(), now.Month())
_, err := os.Stat(dir) _, err := os.Stat(dir)
if err != nil { if err != nil {
err = os.MkdirAll(dir, 0755) err = os.MkdirAll(dir, 0755)
if err != nil { if err != nil {
return "", fmt.Errorf("创建上传目录失败:%s", err) return "", fmt.Errorf("error with create upload dir%v", err)
} }
} }
fileExt := filepath.Ext(filename) fileExt := filepath.Ext(filename)
return fmt.Sprintf("%s/%d%s", dir, now.UnixNano(), fileExt), nil return fmt.Sprintf("%s/%d%s", dir, now.UnixMicro(), fileExt), nil
} }
// GenUploadUrl 生成上传文件 URL // GenUploadUrl 生成上传文件 URL