file.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package file
  2. import (
  3. "fmt"
  4. "mime/multipart"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. "github.com/disintegration/imaging"
  9. "github.com/gin-gonic/gin"
  10. "github.com/runningwater/gohub/pkg/app"
  11. "github.com/runningwater/gohub/pkg/auth"
  12. "github.com/runningwater/gohub/pkg/helpers"
  13. )
  14. // Put 将数据写入文件
  15. // 如果文件不存在,则创建文件
  16. // 如果文件存在,则覆盖文件
  17. // data: 要写入的数据
  18. // to: 要写入的文件路径
  19. // return:
  20. // 如果成功,则返回 nil
  21. // 如果失败,则返回错误信息
  22. func Put(data []byte, to string) error {
  23. return os.WriteFile(to, data, 0644)
  24. }
  25. // Exists 判断文件是否存在
  26. // path: 文件路径
  27. // return:
  28. // 如果文件存在,则返回 true
  29. // 如果文件不存在,则返回 false
  30. func Exists(path string) bool {
  31. _, err := os.Stat(path)
  32. return !os.IsNotExist(err)
  33. }
  34. func NameWithoutExtension(fileName string) string {
  35. return strings.TrimSuffix(fileName, filepath.Ext(fileName))
  36. }
  37. func SaveUploadAvatar(c *gin.Context, file *multipart.FileHeader) (string, error) {
  38. var avatar string
  39. // 确保目录存在,不存在创建
  40. publicPath := "public"
  41. dirName := fmt.Sprintf("/uploads/avatars/%s/%s/", app.TimenowInTimezone().Format("2006/01/02"), auth.CurrentUID(c))
  42. if err := os.MkdirAll(publicPath+dirName, 0755); err != nil {
  43. return "", err
  44. }
  45. // 保存文件
  46. fileName := randomNameFromUploadFile(file)
  47. avatarPath := publicPath + dirName + fileName
  48. if err := c.SaveUploadedFile(file, avatarPath); err != nil {
  49. return avatar, err
  50. }
  51. // 剪裁图片
  52. img, err := imaging.Open(avatarPath, imaging.AutoOrientation(true))
  53. if err != nil {
  54. return avatar, err
  55. }
  56. // 剪裁为 256x256
  57. resizeAvatar := imaging.Thumbnail(img, 256, 256, imaging.Lanczos)
  58. resizeAvatarName := randomNameFromUploadFile(file)
  59. resizeAvatarPath := publicPath + dirName + resizeAvatarName
  60. // 保存为 JPEG 格式
  61. err = imaging.Save(resizeAvatar, resizeAvatarPath)
  62. if err != nil {
  63. return avatar, err
  64. }
  65. // 删除原文件
  66. err = os.Remove(avatarPath)
  67. if err != nil {
  68. return avatar, err
  69. }
  70. return dirName + resizeAvatarName, nil
  71. }
  72. func randomNameFromUploadFile(file *multipart.FileHeader) string {
  73. return helpers.RandomString(16) + filepath.Ext(file.Filename)
  74. }