uploadFile.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package controller
  2. import (
  3. cm "app.yhyue.com/moapp/jybase/common"
  4. "bindresume/config"
  5. "fmt"
  6. "github.com/gin-gonic/gin"
  7. "log"
  8. "math/rand"
  9. "mime/multipart"
  10. "net/http"
  11. "os"
  12. "path/filepath"
  13. "strings"
  14. "time"
  15. )
  16. func UploadFile(r *gin.Context) {
  17. // 设置内存限制(100 MB)
  18. if err := r.Request.ParseMultipartForm(100 << 20); err != nil {
  19. r.JSON(http.StatusBadRequest, gin.H{
  20. "error": "文件大小超过限制(最大100MB)",
  21. })
  22. return
  23. }
  24. // 获取所有文件(兼容多字段)
  25. form, err := r.MultipartForm()
  26. if err != nil {
  27. r.JSON(http.StatusBadRequest, gin.H{
  28. "error": "无法解析表单",
  29. })
  30. return
  31. }
  32. // 收集所有上传的文件
  33. var allFiles []*multipart.FileHeader
  34. for fieldName := range form.File {
  35. allFiles = append(allFiles, form.File[fieldName]...)
  36. }
  37. // 处理上传结果
  38. successFiles := make([]string, 0)
  39. failedFiles := make(map[string]string)
  40. for _, fileHeader := range allFiles {
  41. // 生成唯一文件名(时间戳+随机数)
  42. uniqueName := fmt.Sprintf("%s_%d%s",
  43. time.Now().Format("20060102150405001")+cm.GetComplexRandom(8, 0, 0),
  44. rand.Intn(1000),
  45. filepath.Ext(fileHeader.Filename),
  46. )
  47. // 检查文件类型(示例:仅允许图片)
  48. allowedTypes := map[string]bool{
  49. ".jpg": true,
  50. ".jpeg": true,
  51. ".png": true,
  52. ".gif": true,
  53. }
  54. ext := filepath.Ext(uniqueName)
  55. if !allowedTypes[ext] {
  56. failedFiles[fileHeader.Filename] = "文件类型不允许"
  57. continue
  58. }
  59. // 保存文件
  60. //dst := filepath.Join(config.SysConfig.FilePath, uniqueName)
  61. filePath := GetFilePath(uniqueName, "bifile")
  62. log.Println("获取路径", filePath)
  63. if err := r.SaveUploadedFile(fileHeader, filePath); err != nil {
  64. failedFiles[fileHeader.Filename] = fmt.Sprintf("保存失败: %v", err)
  65. continue
  66. }
  67. successFiles = append(successFiles, fmt.Sprintf("/shareFile/%s", strings.Replace(filePath, cm.ObjToString(config.SysConfig.FilePath), "", 1)))
  68. }
  69. // 返回响应
  70. r.JSON(http.StatusOK, gin.H{
  71. "success_count": len(successFiles),
  72. "success_files": successFiles,
  73. "failed_count": len(failedFiles),
  74. "failed_files": failedFiles,
  75. })
  76. }
  77. // 获取文件路径、名称
  78. func GetFilePath(fm, types string) (s string) {
  79. var tm = time.Now().Format("20060102")
  80. var path = config.SysConfig.FilePath + types + "/" + tm[:4] + "/" + tm[4:6] + "/"
  81. os.MkdirAll(path, 0700)
  82. return path + fm
  83. }