yinbangzhong
2024-06-12 eb1d2e16e0ec4721ba48d101ced1e4b994b463fd
multi files upload
4个文件已修改
215 ■■■■■ 已修改文件
controllers/audio.go 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/docs.go 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/swagger.json 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/swagger.yaml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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) {
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": {
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": {
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: