file.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package file
  2. import (
  3. "fmt"
  4. "mime/multipart"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. "github.com/gin-gonic/gin"
  9. "github.com/runningwater/gohub/pkg/app"
  10. "github.com/runningwater/gohub/pkg/auth"
  11. "github.com/runningwater/gohub/pkg/helpers"
  12. )
  13. // Put 将数据写入文件
  14. // 如果文件不存在,则创建文件
  15. // 如果文件存在,则覆盖文件
  16. // data: 要写入的数据
  17. // to: 要写入的文件路径
  18. // return:
  19. // 如果成功,则返回 nil
  20. // 如果失败,则返回错误信息
  21. func Put(data []byte, to string) error {
  22. return os.WriteFile(to, data, 0644)
  23. }
  24. // Exists 判断文件是否存在
  25. // path: 文件路径
  26. // return:
  27. // 如果文件存在,则返回 true
  28. // 如果文件不存在,则返回 false
  29. func Exists(path string) bool {
  30. _, err := os.Stat(path)
  31. return !os.IsNotExist(err)
  32. }
  33. func NameWithoutExtension(fileName string) string {
  34. return strings.TrimSuffix(fileName, filepath.Ext(fileName))
  35. }
  36. func SaveUploadAvatar(c *gin.Context, file *multipart.FileHeader) (string, error) {
  37. var avatar string
  38. // 确保目录存在,不存在创建
  39. publicPath := "public"
  40. dirName := fmt.Sprintf("/uploads/avatars/%s/%s/", app.TimenowInTimezone().Format("2006/01/02"), auth.CurrentUID(c))
  41. if err := os.MkdirAll(publicPath+dirName, 0755); err != nil {
  42. return "", err
  43. }
  44. // 保存文件
  45. fileName := randomNameFromUploadFile(file)
  46. avatarPath := publicPath + dirName + fileName
  47. if err := c.SaveUploadedFile(file, avatarPath); err != nil {
  48. return avatar, err
  49. }
  50. return avatarPath, nil
  51. }
  52. func randomNameFromUploadFile(file *multipart.FileHeader) string {
  53. return helpers.RandomString(16) + filepath.Ext(file.Filename)
  54. }