package file import ( "fmt" "mime/multipart" "os" "path/filepath" "strings" "github.com/disintegration/imaging" "github.com/gin-gonic/gin" "github.com/runningwater/gohub/pkg/app" "github.com/runningwater/gohub/pkg/auth" "github.com/runningwater/gohub/pkg/helpers" ) // Put 将数据写入文件 // 如果文件不存在,则创建文件 // 如果文件存在,则覆盖文件 // data: 要写入的数据 // to: 要写入的文件路径 // return: // 如果成功,则返回 nil // 如果失败,则返回错误信息 func Put(data []byte, to string) error { return os.WriteFile(to, data, 0644) } // Exists 判断文件是否存在 // path: 文件路径 // return: // 如果文件存在,则返回 true // 如果文件不存在,则返回 false func Exists(path string) bool { _, err := os.Stat(path) return !os.IsNotExist(err) } func NameWithoutExtension(fileName string) string { return strings.TrimSuffix(fileName, filepath.Ext(fileName)) } func SaveUploadAvatar(c *gin.Context, file *multipart.FileHeader) (string, error) { var avatar string // 确保目录存在,不存在创建 publicPath := "public" dirName := fmt.Sprintf("/uploads/avatars/%s/%s/", app.TimenowInTimezone().Format("2006/01/02"), auth.CurrentUID(c)) if err := os.MkdirAll(publicPath+dirName, 0755); err != nil { return "", err } // 保存文件 fileName := randomNameFromUploadFile(file) avatarPath := publicPath + dirName + fileName if err := c.SaveUploadedFile(file, avatarPath); err != nil { return avatar, err } // 剪裁图片 img, err := imaging.Open(avatarPath, imaging.AutoOrientation(true)) if err != nil { return avatar, err } // 剪裁为 256x256 resizeAvatar := imaging.Thumbnail(img, 256, 256, imaging.Lanczos) resizeAvatarName := randomNameFromUploadFile(file) resizeAvatarPath := publicPath + dirName + resizeAvatarName // 保存为 JPEG 格式 err = imaging.Save(resizeAvatar, resizeAvatarPath) if err != nil { return avatar, err } // 删除原文件 err = os.Remove(avatarPath) if err != nil { return avatar, err } return dirName + resizeAvatarName, nil } func randomNameFromUploadFile(file *multipart.FileHeader) string { return helpers.RandomString(16) + filepath.Ext(file.Filename) }