From 28c8fccc406480639d8840c5d2b2de9f5fab5f5f Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 9 Jul 2025 01:00:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=95=B0=E6=8D=AE=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gin_ops/def_config/config_temp.yaml | 12 +-- gin_ops/main.go | 2 +- gin_ops/models/config.go | 9 --- gin_ops/models/config_head.go | 34 ++++++-- gin_ops/routers/api_files.go | 118 ---------------------------- gin_ops/routers/routers_flie.go | 8 +- 6 files changed, 40 insertions(+), 143 deletions(-) diff --git a/gin_ops/def_config/config_temp.yaml b/gin_ops/def_config/config_temp.yaml index aeefae4..2d1e27a 100644 --- a/gin_ops/def_config/config_temp.yaml +++ b/gin_ops/def_config/config_temp.yaml @@ -24,12 +24,12 @@ user: file: max_size: 52428800 pahts: - - "./data/avatar/" - - "./data/upload/image/" - - "./data/upload/video/" - - "./data/upload/music/" - - "./data/upload/pdf/" - - "./data/upload/other/" + avatar: "./data/avatar/" + image: "./data/upload/image/" + video: "./data/upload/video/" + music: "./data/upload/music/" + pdf: "./data/upload/pdf/" + other: "./data/upload/other/" allow_image_mime: image/jpeg: true diff --git a/gin_ops/main.go b/gin_ops/main.go index bd25dd4..5390177 100644 --- a/gin_ops/main.go +++ b/gin_ops/main.go @@ -77,7 +77,7 @@ func main() { r.Static("/dist/", "./static/dist/") //静态用户上传的文件 - r.Static("/avatar/", models.Configs_file.Pahts[0]) + r.Static("/avatar/", models.Configs_file.Pahts["avatar"]) //store := cookie.NewStore([]byte("secret")) // 自定义 404 页面(需要提前加载模板) diff --git a/gin_ops/models/config.go b/gin_ops/models/config.go index 3743a9c..d3a628c 100644 --- a/gin_ops/models/config.go +++ b/gin_ops/models/config.go @@ -15,16 +15,7 @@ var Configs_file Configs_file_t var Database_configs map[string]interface{} -var Allowed_avatar_ext = map[string]bool{ - ".jpg": true, - ".jpeg": true, - ".png": true, -} -var Allowed_avatar_mime = map[string]bool{ - "image/jpeg": true, - "image/png": true, -} func init() { diff --git a/gin_ops/models/config_head.go b/gin_ops/models/config_head.go index f707b9a..92ebf00 100644 --- a/gin_ops/models/config_head.go +++ b/gin_ops/models/config_head.go @@ -1,5 +1,27 @@ package models +//mime信息转换位拓展名 +var Mime_to_extname = map[string]string{ + + "image/jpeg": ".jpeg", + "image/png": ".png", + "image/gif": ".gif", + "image/bmp": ".bmp", + + "video/mp4": ".mp4", + "video/x-msvideo": ".", + "video/quicktime": ".", + "video/x-flv": ".flv", + "video/mpeg": ".mpeg", + + "audio/mpeg": ".mp3", + "audio/aac": ".acc", + "audio/wav": ".wav", + "audio/flac": ".flac", + + "application/pdf": ".pdf", +} + type Configs_web_t struct { Host string `mapstructure:"host"` Port string `mapstructure:"port"` @@ -17,10 +39,10 @@ type Configs_user_t struct { } type Configs_file_t struct { - Max_size uint64 `mapstructure:"max_size"` - Pahts []string `mapstructure:"pahts"` - Allow_image_mime map[string]bool `mapstructure:"allow_image_mime"` - Allow_video_mime map[string]bool `mapstructure:"allow_video_mime"` - Allow_music_mime map[string]bool `mapstructure:"allow_music_mime"` - Allow_pdf_mime map[string]bool `mapstructure:"allow_pdf_mime"` + Max_size uint64 `mapstructure:"max_size"` + Pahts map[string]string `mapstructure:"pahts"` + Allow_image_mime map[string]bool `mapstructure:"allow_image_mime"` + Allow_video_mime map[string]bool `mapstructure:"allow_video_mime"` + Allow_music_mime map[string]bool `mapstructure:"allow_music_mime"` + Allow_pdf_mime map[string]bool `mapstructure:"allow_pdf_mime"` } diff --git a/gin_ops/routers/api_files.go b/gin_ops/routers/api_files.go index 97b79a3..76c6d14 100644 --- a/gin_ops/routers/api_files.go +++ b/gin_ops/routers/api_files.go @@ -2,14 +2,8 @@ package routers import ( "bytes" - "crypto/sha256" - "encoding/hex" "fmt" "io" - "net/http" - "path" - "path/filepath" - "saas/models" "time" "github.com/gin-gonic/gin" @@ -94,118 +88,6 @@ func V1_file_api(r *gin.RouterGroup) { //接收头像的接口, r.POST("/avatar", func(ctx *gin.Context) { - //返回前端的数据 - err_msg := "user_api_error" - err_code := Error_code[err_msg] - data := map[string]interface{}{} - //判断权限是否可以接收 - //先判断是否已经登录 - //获取中间件处理的结果 - is_login, _ := ctx.Get("is_login") - if is_login == true { - //读取用户id信息 - user, _ := ctx.Get("user") - //保存这个头像 - file, err := ctx.FormFile("file") - if err == nil { - //限制文件大小 - if file.Size > 512 { - if file.Size < 1024000 { - // 2. 安全获取文件名并处理路径问题 - filename := filepath.Base(file.Filename) // 防御性处理路径分隔符 - // 3. 获取标准后缀名(含点) - extWithDot := filepath.Ext(filename) - //判断后缀名类型是否是允许的 - if models.Allowed_avatar_ext[extWithDot] { - //判断文件mime是否合法 - // 打开文件流 - src_mime, _ := file.Open() - defer src_mime.Close() - // 读取前512字节用于MIME检测 - buffer := make([]byte, 512) - io.ReadFull(src_mime, buffer) - // 检测MIME类型 - mimeType := http.DetectContentType(buffer) - if models.Allowed_avatar_mime[mimeType] { - // 打开文件流 - src, _ := file.Open() - defer src.Close() - // 创建SHA256哈希器 - hasher := sha256.New() - - // 计算哈希值 - io.Copy(hasher, src) - // 获取哈希结果 - hashBytes := hasher.Sum(nil) - hashString := hex.EncodeToString(hashBytes) - - new_filename := fmt.Sprintf("%d_%s%s", user.(*models.User).ID, hashString, extWithDot) - file.Filename = new_filename - - //这是上传的真实路径 - dst := path.Join("./data/avatar", file.Filename) - - //这是经过gin路由的路径 - gin_dat := path.Join("/avatar", file.Filename) - - //判断文件是否存在避免重复保存 - if models.File_exists(dst) { - //fmt.Println("文件存在") - err_msg = "api_ok" - err_code = Error_code[err_msg] - //返回gin路由的路径 - data["path"] = gin_dat - data["new_path"] = false - } else { - //fmt.Println("文件no存在") - ferr := ctx.SaveUploadedFile(file, dst) - if ferr == nil { - //文件保存成功 - err_msg = "api_ok" - err_code = Error_code[err_msg] - //返回gin路由的路径 - data["path"] = gin_dat - data["new_path"] = true - - } else { - err_msg = "file_save_err" - err_code = Error_code[err_msg] - fmt.Println(ferr) - data["err"] = ferr - } - } - } else { - err_msg = "file_mime_err" - err_code = Error_code[err_msg] - } - - } else { - err_msg = "file_type_err" - err_code = Error_code[err_msg] - } - } else { - err_msg = "file_size_err" - err_code = Error_code[err_msg] - } - } else { - err_msg = "file_size_err" - err_code = Error_code[err_msg] - } - - } else { - err_msg = "file_get_err" - err_code = Error_code[err_msg] - } - } else { - err_msg = "user_no_sign" - err_code = Error_code[err_msg] - } - ctx.JSON(200, map[string]interface{}{ - "api": "ok", - "err_code": err_code, - "err_msg": err_msg, - "data": data, - }) }) } diff --git a/gin_ops/routers/routers_flie.go b/gin_ops/routers/routers_flie.go index 6055319..568f083 100644 --- a/gin_ops/routers/routers_flie.go +++ b/gin_ops/routers/routers_flie.go @@ -41,7 +41,7 @@ func Router_file(r *gin.RouterGroup) { //先判断有没有登录 user_info_any, is_login := ctx.Get("user_info") //因为需要读取user_info,避免重复调用 这一步就不在中间件操作了 if is_login { - user_info := user_info_any.(models.User_info) //直接断言类型,这个值是从数据库直接读取的 理论不会出错 + user_info := user_info_any.(*models.User_info) //直接断言类型,这个值是从数据库直接读取的 理论不会出错 file, err := ctx.FormFile("file") if err == nil { @@ -75,11 +75,13 @@ func Router_file(r *gin.RouterGroup) { hashBytes := hasher.Sum(nil) hashString := hex.EncodeToString(hashBytes) - new_filename := fmt.Sprintf("%d_%s", user_info.UserID, hashString) + new_filename := fmt.Sprintf("%s", hashString) file.Filename = new_filename + fmt.Println(user_info) + //这是上传的真实路径 - dst := path.Join("./data/avatar", file.Filename) + dst := path.Join(models.Configs_file.Pahts["image"], file.Filename) //判断文件是否存在避免重复保存 if models.File_exists(dst) {