From eb1d2e16e0ec4721ba48d101ced1e4b994b463fd Mon Sep 17 00:00:00 2001
From: yinbangzhong <zhongbangyin@126.com>
Date: 星期三, 12 六月 2024 16:59:21 +0800
Subject: [PATCH] multi files upload

---
 docs/swagger.yaml    |    8 +
 controllers/audio.go |  178 +++++++++++++++++++++++++-------------------
 docs/docs.go         |   16 +++-
 docs/swagger.json    |   13 ++
 4 files changed, 131 insertions(+), 84 deletions(-)

diff --git a/controllers/audio.go b/controllers/audio.go
index 7c58dd9..c1b2c2f 100644
--- a/controllers/audio.go
+++ b/controllers/audio.go
@@ -6,6 +6,7 @@
 	"github.com/gin-gonic/gin"
 	"gorm.io/gorm"
 	"io"
+	"mime/multipart"
 	"os"
 	"path"
 	"speechAnalysis/constvar"
@@ -27,91 +28,114 @@
 // @Tags      闊抽
 // @Summary   涓婁紶闊抽
 // @Produce   application/json
-// @Param file formData file true "闊抽鏂囦欢"
+// @Param file formData file false "闊抽鏂囦欢"
+// @Param files formData []file false "澶氫釜闊抽鏂囦欢"
 // @Success   200 {object} util.Response "鎴愬姛"
 // @Router    /api-sa/v1/audio/upload [post]
 func (slf AudioCtl) Upload(c *gin.Context) {
-	_, header, err := c.Request.FormFile("file")
-	if err != nil {
-		util.ResponseFormat(c, code.RequestParamError, err.Error())
-		return
-	}
 
-	filename := path.Base(header.Filename)
+	f := func(header *multipart.FileHeader) error {
+		logFormat := "%s锛�%s   "
+		filename := path.Base(header.Filename)
 
-	arr := strings.Split(filename, "_")
-	if len(arr) != 6 {
-		util.ResponseFormat(c, code.RequestParamError, "鏂囦欢鍚嶇О閿欒")
-		return
-	}
-
-	_, err = models.NewAudioSearch().SetName(filename).First()
-	if err != gorm.ErrRecordNotFound {
-		util.ResponseFormat(c, code.RequestParamError, "閲嶅涓婁紶")
-		return
-	}
-
-	oss := upload.NewOss()
-	filePath, filename, uploadErr := oss.UploadFile(header)
-	if uploadErr != nil {
-		logx.Errorf("upload audio err: %v", err)
-		util.ResponseFormat(c, code.RequestParamError, "涓婁紶澶辫触")
-		return
-	}
-
-	timeStr := arr[4] + strings.Split(arr[5], ".")[0]
-
-	t, err := time.ParseInLocation("20060102150405", timeStr, time.Local)
-
-	if err != nil {
-		util.ResponseFormat(c, code.RequestParamError, "鏃堕棿鏍煎紡涓嶅")
-		return
-	}
-
-	audio := &models.Audio{
-		Name:             filename,
-		Size:             header.Size,
-		FilePath:         filePath,
-		AudioStatus:      constvar.AudioStatusUploadOk,
-		LocomotiveNumber: arr[0],
-		TrainNumber:      arr[1],
-		DriverNumber:     arr[2],
-		Station:          arr[3],
-		OccurrenceAt:     t,
-		IsFollowed:       0,
-	}
-
-	if err = models.NewAudioSearch().Create(audio); err != nil {
-		util.ResponseFormat(c, code.SaveFail, "涓婁紶澶辫触")
-		return
-	}
-	go func() {
-
-		var trainInfoNames = []string{arr[0], arr[1], arr[3]}
-
-		var (
-			info   *models.TrainInfo
-			err    error
-			parent models.TrainInfo
-		)
-		for i := 0; i < 3; i++ {
-			name := trainInfoNames[i]
-			class := constvar.Class(i + 1)
-			info, err = models.NewTrainInfoSearch().SetName(name).SetClass(class).First()
-			if err == gorm.ErrRecordNotFound {
-				info = &models.TrainInfo{
-					Name:     name,
-					Class:    class,
-					ParentID: parent.ID,
-				}
-				_ = models.NewTrainInfoSearch().Create(info)
-			}
-			parent = *info
+		arr := strings.Split(filename, "_")
+		if len(arr) != 6 {
+			//util.ResponseFormat(c, code.RequestParamError, "鏂囦欢鍚嶇О閿欒")
+			return errors.New(fmt.Sprintf(logFormat, filename, "鏂囦欢鍚嶇О閿欒"))
 		}
 
-	}()
+		_, err := models.NewAudioSearch().SetName(filename).First()
+		if err != gorm.ErrRecordNotFound {
+			//util.ResponseFormat(c, code.RequestParamError, "閲嶅涓婁紶")
+			return errors.New(fmt.Sprintf(logFormat, filename, "閲嶅涓婁紶"))
+		}
 
-	util.ResponseFormat(c, code.Success, "娣诲姞鎴愬姛")
+		oss := upload.NewOss()
+		filePath, filename, uploadErr := oss.UploadFile(header)
+		if uploadErr != nil {
+			logx.Errorf("upload audio err: %v", err)
+			//util.ResponseFormat(c, code.RequestParamError, "涓婁紶澶辫触")
+			return errors.New(fmt.Sprintf(logFormat, filename, "涓婁紶澶辫触"))
+		}
+
+		timeStr := arr[4] + strings.Split(arr[5], ".")[0]
+
+		t, err := time.ParseInLocation("20060102150405", timeStr, time.Local)
+
+		if err != nil {
+			//util.ResponseFormat(c, code.RequestParamError, "鏃堕棿鏍煎紡涓嶅")
+			return errors.New(fmt.Sprintf(logFormat, filename, "涓婁紶澶辫触"))
+		}
+
+		audio := &models.Audio{
+			Name:             filename,
+			Size:             header.Size,
+			FilePath:         filePath,
+			AudioStatus:      constvar.AudioStatusUploadOk,
+			LocomotiveNumber: arr[0],
+			TrainNumber:      arr[1],
+			DriverNumber:     arr[2],
+			Station:          arr[3],
+			OccurrenceAt:     t,
+			IsFollowed:       0,
+		}
+
+		if err = models.NewAudioSearch().Create(audio); err != nil {
+			//util.ResponseFormat(c, code.SaveFail, "涓婁紶澶辫触")
+			return errors.New(fmt.Sprintf(logFormat, filename, "涓婁紶澶辫触"))
+		}
+		go func() {
+
+			var trainInfoNames = []string{arr[0], arr[1], arr[3]}
+
+			var (
+				info   *models.TrainInfo
+				err    error
+				parent models.TrainInfo
+			)
+			for i := 0; i < 3; i++ {
+				name := trainInfoNames[i]
+				class := constvar.Class(i + 1)
+				info, err = models.NewTrainInfoSearch().SetName(name).SetClass(class).First()
+				if err == gorm.ErrRecordNotFound {
+					info = &models.TrainInfo{
+						Name:     name,
+						Class:    class,
+						ParentID: parent.ID,
+					}
+					_ = models.NewTrainInfoSearch().Create(info)
+				}
+				parent = *info
+			}
+
+		}()
+		return nil
+	}
+	var headers []*multipart.FileHeader
+	_, header, _ := c.Request.FormFile("file")
+	if header != nil {
+		headers = append(headers, header)
+	}
+	if len(c.Request.MultipartForm.File["files"]) > 0 {
+		headers = c.Request.MultipartForm.File["files"]
+	}
+	var errs []error
+	for _, h := range headers {
+		if e := f(h); e != nil {
+			errs = append(errs, e)
+		}
+	}
+	if len(errs) > 0 {
+		var r strings.Builder
+		for _, e := range errs {
+			r.WriteString(e.Error())
+		}
+		util.ResponseFormat(c, code.RequestParamError, r.String())
+		return
+	} else {
+		util.ResponseFormat(c, code.Success, "娣诲姞鎴愬姛")
+		return
+	}
 }
 
 func (slf AudioCtl) ParamsCheck(filename string) (err error) {
diff --git a/docs/docs.go b/docs/docs.go
index e0e5b79..0a3a707 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -1,5 +1,4 @@
-// Code generated by swaggo/swag. DO NOT EDIT.
-
+// Package docs Code generated by swaggo/swag. DO NOT EDIT
 package docs
 
 import "github.com/swaggo/swag"
@@ -470,8 +469,17 @@
                         "type": "file",
                         "description": "闊抽鏂囦欢",
                         "name": "file",
-                        "in": "formData",
-                        "required": true
+                        "in": "formData"
+                    },
+                    {
+                        "type": "array",
+                        "items": {
+                            "type": "file"
+                        },
+                        "collectionFormat": "csv",
+                        "description": "澶氫釜闊抽鏂囦欢",
+                        "name": "files",
+                        "in": "formData"
                     }
                 ],
                 "responses": {
diff --git a/docs/swagger.json b/docs/swagger.json
index 18118cc..e04646a 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -458,8 +458,17 @@
                         "type": "file",
                         "description": "闊抽鏂囦欢",
                         "name": "file",
-                        "in": "formData",
-                        "required": true
+                        "in": "formData"
+                    },
+                    {
+                        "type": "array",
+                        "items": {
+                            "type": "file"
+                        },
+                        "collectionFormat": "csv",
+                        "description": "澶氫釜闊抽鏂囦欢",
+                        "name": "files",
+                        "in": "formData"
                     }
                 ],
                 "responses": {
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 4082cb8..d463d34 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -487,8 +487,14 @@
       - description: 闊抽鏂囦欢
         in: formData
         name: file
-        required: true
         type: file
+      - collectionFormat: csv
+        description: 澶氫釜闊抽鏂囦欢
+        in: formData
+        items:
+          type: file
+        name: files
+        type: array
       produces:
       - application/json
       responses:

--
Gitblit v1.8.0