upload_file.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package backend
  2. import (
  3. "context"
  4. "fmt"
  5. "kpt-pasture/config"
  6. "kpt-pasture/util"
  7. "mime/multipart"
  8. "os"
  9. "path/filepath"
  10. "time"
  11. "gitee.com/xuyiping_admin/pkg/xerr"
  12. )
  13. func (s *StoreEntry) Photos(ctx context.Context, files []*multipart.FileHeader) ([]string, error) {
  14. userModel, err := s.GetUserModel(ctx)
  15. if err != nil {
  16. return nil, err
  17. }
  18. workDir := fmt.Sprintf("%s", config.WorkDir)
  19. pathDir := fmt.Sprintf("/files/photos/%d/%s", userModel.AppPasture.Id, time.Now().Format("20060102"))
  20. saveDir := filepath.Join(workDir, pathDir)
  21. if _, err = os.Stat(saveDir); os.IsNotExist(err) {
  22. if err = os.MkdirAll(saveDir, 0755); err != nil {
  23. return nil, xerr.Customf("创建目录失败: %s", err.Error())
  24. }
  25. }
  26. // 处理每个文件
  27. filePaths := make([]string, len(files))
  28. for i, file := range files {
  29. contentType := file.Header.Get("Content-Type")
  30. if contentType != "image/jpeg" && contentType != "image/png" && contentType != "image/gif" {
  31. return nil, xerr.Customf("图片格式错误: %s", file.Filename)
  32. }
  33. if file.Size > 1024*1024*5 {
  34. return nil, xerr.Customf("单个图片文件不能超过5MB")
  35. }
  36. ext := filepath.Ext(file.Filename)
  37. if ext == "" {
  38. switch contentType {
  39. case "image/jpeg":
  40. ext = ".jpg"
  41. case "image/png":
  42. ext = ".png"
  43. case "image/gif":
  44. ext = ".gif"
  45. default:
  46. ext = ".jpg" // 默认
  47. }
  48. }
  49. randomName := util.GenerateRandomNumberString(32)
  50. finalFilename := randomName + ext
  51. fPath := filepath.Join(saveDir, finalFilename)
  52. urlPath := filepath.Join(pathDir, finalFilename)
  53. if err = util.SaveUploadedFile(file, fPath); err != nil {
  54. return nil, xerr.Customf("保存文件失败: %s", err.Error())
  55. }
  56. filePaths[i] = urlPath
  57. }
  58. return filePaths, nil
  59. }