package system import ( "fmt" "os" "path" "strings" "sun-panel/api/api_v1/common/apiData/commonApiStructs" "sun-panel/api/api_v1/common/apiReturn" "sun-panel/api/api_v1/common/base" "sun-panel/global" "sun-panel/lib/cmn" "sun-panel/models" "time" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "gorm.io/gorm" ) type FileApi struct{} func (a *FileApi) UploadImg(c *gin.Context) { userInfo, _ := base.GetCurrentUserInfo(c) configUpload := global.Config.GetValueString("base", "source_path") f, err := c.FormFile("imgfile") if err != nil { apiReturn.Error(c, "上传失败") return } else { fileExt := strings.ToLower(path.Ext(f.Filename)) agreeExts := []string{ ".png", ".jpg", ".gif", ".jpeg", ".webp", ".svg", ".ico", } if !cmn.InArray(agreeExts, fileExt) { apiReturn.Error(c, "上传失败!只允许png,jpg,gif,jpeg,svg,ico文件") return } fileName := cmn.Md5(fmt.Sprintf("%s%s", f.Filename, time.Now().String())) fildDir := fmt.Sprintf("%s/%d/%d/%d/", configUpload, time.Now().Year(), time.Now().Month(), time.Now().Day()) isExist, _ := cmn.PathExists(fildDir) if !isExist { os.MkdirAll(fildDir, os.ModePerm) } filepath := fmt.Sprintf("%s%s%s", fildDir, fileName, fileExt) c.SaveUploadedFile(f, filepath) // 像数据库添加记录 mFile := models.File{} mFile.AddFile(userInfo.ID, f.Filename, fileExt, filepath) apiReturn.SuccessData(c, gin.H{ "imageUrl": filepath[1:], }) } } func (a *FileApi) UploadFiles(c *gin.Context) { userInfo, _ := base.GetCurrentUserInfo(c) configUpload := global.Config.GetValueString("base", "source_path") form, err := c.MultipartForm() if err != nil { apiReturn.Error(c, "上传失败") return } files := form.File["files[]"] errFiles := []string{} succMap := map[string]string{} for _, f := range files { fileExt := strings.ToLower(path.Ext(f.Filename)) fileName := cmn.Md5(fmt.Sprintf("%s%s", f.Filename, time.Now().String())) fildDir := fmt.Sprintf("%s/%d/%d/%d/", configUpload, time.Now().Year(), time.Now().Month(), time.Now().Day()) isExist, _ := cmn.PathExists(fildDir) if !isExist { os.MkdirAll(fildDir, os.ModePerm) } filepath := fmt.Sprintf("%s%s%s", fildDir, fileName, fileExt) if c.SaveUploadedFile(f, filepath) != nil { errFiles = append(errFiles, f.Filename) } else { // 成功 // 像数据库添加记录 mFile := models.File{} mFile.AddFile(userInfo.ID, f.Filename, fileExt, filepath) succMap[f.Filename] = filepath[1:] } } apiReturn.SuccessData(c, gin.H{ "succMap": succMap, "errFiles": errFiles, }) } func (a *FileApi) GetList(c *gin.Context) { list := []models.File{} userInfo, _ := base.GetCurrentUserInfo(c) var count int64 if err := global.Db.Order("created_at desc").Find(&list, "user_id=?", userInfo.ID).Count(&count).Error; err != nil { apiReturn.ErrorDatabase(c, err.Error()) return } data := []map[string]interface{}{} for _, v := range list { data = append(data, map[string]interface{}{ "src": v.Src[1:], "fileName": v.FileName, "id": v.ID, "createTime": v.CreatedAt, "updateTime": v.UpdatedAt, "path": v.Src, }) } apiReturn.SuccessListData(c, data, count) } func (a *FileApi) Deletes(c *gin.Context) { req := commonApiStructs.RequestDeleteIds[uint]{} userInfo, _ := base.GetCurrentUserInfo(c) if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { apiReturn.ErrorParamFomat(c, err.Error()) return } global.Db.Transaction(func(tx *gorm.DB) error { files := []models.File{} if err := tx.Order("created_at desc").Find(&files, "user_id=? AND id in ?", userInfo.ID, req.Ids).Error; err != nil { return err } for _, v := range files { os.Remove(v.Src) } if err := tx.Order("created_at desc").Delete(&files, "user_id=? AND id in ?", userInfo.ID, req.Ids).Error; err != nil { return err } return nil }) apiReturn.Success(c) }