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