From 500985cf7556808ee42e2e9e3066bb4648a8e534 Mon Sep 17 00:00:00 2001 From: yinbangzhong <zhongbangyin@126.com> Date: 星期二, 18 六月 2024 14:28:16 +0800 Subject: [PATCH] watch preloads file to autoload --- service/process.go | 241 +++++++++++++++++++++++++-------------- docs/swagger.yaml | 14 ++ controllers/audio.go | 18 +- docs/docs.go | 20 +++ docs/swagger.json | 20 +++ 5 files changed, 213 insertions(+), 100 deletions(-) diff --git a/controllers/audio.go b/controllers/audio.go index 0717d9b..8f5f108 100644 --- a/controllers/audio.go +++ b/controllers/audio.go @@ -7,6 +7,7 @@ "gorm.io/gorm" "io" "mime/multipart" + "net/url" "os" "path" "path/filepath" @@ -28,14 +29,16 @@ // Upload // @Tags 闊抽 // @Summary 涓婁紶闊抽 +// @Accept multipart/form-data // @Produce application/json -// @Param files formData []file false "澶氭枃浠朵笂浼�" +// @Param file formData []file false "澶氭枃浠朵笂浼�" // @Success 200 {object} util.Response "鎴愬姛" // @Router /api-sa/v1/audio/upload [post] func (slf AudioCtl) Upload(c *gin.Context) { var headers []*multipart.FileHeader - if len(c.Request.MultipartForm.File["file"]) > 1 { - headers = c.Request.MultipartForm.File["file"] + files, _ := c.MultipartForm() + if len(files.File["file"]) > 1 { + headers = files.File["file"] } else { util.ResponseFormat(c, code.RequestParamError, "鏂囦欢闇�瑕佷竴涓�瀵瑰簲") return @@ -89,7 +92,7 @@ //瑙f瀽 浜よ矾鍙�:123_鍏噷鏍�:321 fileds := string(bts) arr = strings.Split(fileds, "_") - if len(arr) > 1 { + if len(arr) != 2 { util.ResponseFormat(c, code.RequestParamError, "鏂囦欢鍐呭鏍煎紡涓嶅") return } else { @@ -291,8 +294,9 @@ } if params.Filetype == 2 { filepath = audio.TxtFilePath - //璁剧疆Content-Type涓簍xt鏂囦欢绫诲瀷 - c.Header("Content-Type", "text/plain") + //璁剧疆Content-Type涓簍xt鏂囦欢绫诲瀷,閬垮厤涓枃涔辩爜 + c.Header("Content-Type", "text/plain; charset=utf-8") + c.Header("Content-Transfer-Encoding", "binary") } if filepath == "" { util.ResponseFormat(c, code.InternalError, "鏌ヨ澶辫触") @@ -312,7 +316,7 @@ return } - c.Header("Content-Disposition", "inline; filename="+audio.Name) // 鍦ㄦ祻瑙堝櫒涓洿鎺ユ墦寮� + c.Header("Content-Disposition", "inline; filename="+url.PathEscape(audio.Name)) // 鍦ㄦ祻瑙堝櫒涓洿鎺ユ墦寮� c.Header("Content-Length", fmt.Sprint(fileInfo.Size())) if _, err := io.Copy(c.Writer, file); err != nil { diff --git a/docs/docs.go b/docs/docs.go index b9de7a5..cad5c53 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -117,6 +117,11 @@ "parameters": [ { "type": "integer", + "name": "fileType", + "in": "query" + }, + { + "type": "integer", "name": "id", "in": "query", "required": true @@ -196,6 +201,11 @@ ], "summary": "闊抽璇︽儏锛屽惈瑙f瀽缁撴灉", "parameters": [ + { + "type": "integer", + "name": "fileType", + "in": "query" + }, { "type": "integer", "name": "id", @@ -457,6 +467,9 @@ }, "/api-sa/v1/audio/upload": { "post": { + "consumes": [ + "multipart/form-data" + ], "produces": [ "application/json" ], @@ -472,7 +485,7 @@ }, "collectionFormat": "csv", "description": "澶氭枃浠朵笂浼�", - "name": "files", + "name": "file", "in": "formData" } ], @@ -697,7 +710,7 @@ "type": "integer" }, "station": { - "description": "杞︾珯", + "description": "鍏噷鏍�", "type": "string" }, "trainNumber": { @@ -822,6 +835,9 @@ "id" ], "properties": { + "fileType": { + "type": "integer" + }, "id": { "type": "integer" } diff --git a/docs/swagger.json b/docs/swagger.json index 8864966..11b18d9 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -106,6 +106,11 @@ "parameters": [ { "type": "integer", + "name": "fileType", + "in": "query" + }, + { + "type": "integer", "name": "id", "in": "query", "required": true @@ -185,6 +190,11 @@ ], "summary": "闊抽璇︽儏锛屽惈瑙f瀽缁撴灉", "parameters": [ + { + "type": "integer", + "name": "fileType", + "in": "query" + }, { "type": "integer", "name": "id", @@ -446,6 +456,9 @@ }, "/api-sa/v1/audio/upload": { "post": { + "consumes": [ + "multipart/form-data" + ], "produces": [ "application/json" ], @@ -461,7 +474,7 @@ }, "collectionFormat": "csv", "description": "澶氭枃浠朵笂浼�", - "name": "files", + "name": "file", "in": "formData" } ], @@ -686,7 +699,7 @@ "type": "integer" }, "station": { - "description": "杞︾珯", + "description": "鍏噷鏍�", "type": "string" }, "trainNumber": { @@ -811,6 +824,9 @@ "id" ], "properties": { + "fileType": { + "type": "integer" + }, "id": { "type": "integer" } diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 42c9890..3d2642c 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -89,7 +89,7 @@ description: 闊抽澶у皬 type: integer station: - description: 杞︾珯 + description: 鍏噷鏍� type: string trainNumber: description: 杞︽ @@ -170,6 +170,8 @@ type: object request.ProcessAudio: properties: + fileType: + type: integer id: type: integer required: @@ -268,6 +270,9 @@ get: parameters: - in: query + name: fileType + type: integer + - in: query name: id required: true type: integer @@ -313,6 +318,9 @@ /api-sa/v1/audio/info: get: parameters: + - in: query + name: fileType + type: integer - in: query name: id required: true @@ -483,13 +491,15 @@ - 闊抽 /api-sa/v1/audio/upload: post: + consumes: + - multipart/form-data parameters: - collectionFormat: csv description: 澶氭枃浠朵笂浼� in: formData items: type: file - name: files + name: file type: array produces: - application/json diff --git a/service/process.go b/service/process.go index 0b67c93..4470791 100644 --- a/service/process.go +++ b/service/process.go @@ -165,6 +165,10 @@ if mkdirErr != nil { logx.Errorf("function os.MkdirAll() err:%v", mkdirErr) } + mkdirErr1 := os.MkdirAll(conf.LocalConf.StorePath, os.ModePerm) + if mkdirErr1 != nil { + logx.Errorf("function os.MkdirAll() err:%v", mkdirErr1) + } //鏂囦欢澶逛笅鏂板闊抽鏂囦欢鏃惰Е鍙� watcher, err := fsnotify.NewWatcher() if err != nil { @@ -175,6 +179,111 @@ if err != nil { log.Fatal(err) } + + audoF := func(eventName, fileName string, audio *models.Audio) bool { + time.Sleep(time.Second * 1) + //璁剧疆鏂囦欢璁块棶鏉冮檺 + err = os.Chmod(eventName, 0777) + if err != nil { + logx.Errorf(fmt.Sprintf("%s:%s", eventName, "璁剧疆鏂囦欢鏉冮檺澶辫触")) + } + + //鏍¢獙鏂囦欢鍛藉悕 + arr := strings.Split(fileName, "_") + if len(arr) != 6 { + logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鏂囦欢鍚嶇О閿欒")) + return false + } + timeStr := arr[4] + strings.Split(arr[5], ".")[0] + t, err := time.ParseInLocation("20060102150405", timeStr, time.Local) + if err != nil { + logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鏃堕棿鏍煎紡涓嶅")) + } + + //鏌ラ噸 + _, err = models.NewAudioSearch().SetName(fileName).First() + if err != gorm.ErrRecordNotFound { + logx.Errorf(fmt.Sprintf("%s:%s", fileName, "閲嶅涓婁紶")) + return false + } + + //灏嗘枃浠剁Щ鍔ㄥ埌uploads鏂囦欢澶逛笅 + //鍒ゆ柇storePath涓湯灏炬槸鍚﹀甫 + var src string + if strings.HasSuffix(conf.LocalConf.StorePath, "/") { + src = conf.LocalConf.StorePath + fileName + } else { + src = conf.LocalConf.StorePath + "/" + fileName + } + err = os.Rename(eventName, src) + if err != nil { + logx.Errorf(fmt.Sprintf("%s:%s", fileName, "绉诲姩鏂囦欢澶辫触")) + return false + } + // 璇诲彇鏂囦欢澶у皬 + fileInfo, err := os.Stat(src) + if err != nil { + logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鑾峰彇鏂囦欢澶у皬澶辫触")) + return false + } + size := fileInfo.Size() + fmt.Println("fileName:", fileName, "size:", size, "src1", src) + + audio.Name = fileName + audio.Size = size + audio.FilePath = src + audio.AudioStatus = constvar.AudioStatusUploadOk + audio.LocomotiveNumber = arr[0] + audio.TrainNumber = arr[1] + audio.DriverNumber = arr[2] + audio.Station = arr[3] + audio.OccurrenceAt = t + audio.IsFollowed = 0 + return true + } + + txtF := func(filePath string, audio *models.Audio) bool { + fileName := filepath.Base(filePath) + //璇诲彇filepath鏂囦欢鍐呭鍒癰ts + bts, err := os.ReadFile(filePath) + if err != nil { + logx.Errorf(fmt.Sprintf("%s:%s", filePath, "璇诲彇txt鏂囦欢澶辫触")) + return false + } + //瑙f瀽 浜よ矾鍙�:123_鍏噷鏍�:321 + fileds := string(bts) + arr := strings.Split(fileds, "_") + if len(arr) != 2 { + logx.Errorf(fmt.Sprintf("%s:%s", filePath, "璇诲彇txt鏂囦欢鍐呭鏍煎紡涓嶅")) + return false + } else { + RouteNumber := strings.Split(arr[0], ":") + KilometerMarker := strings.Split(arr[1], ":") + if len(RouteNumber) > 1 && len(KilometerMarker) > 1 { + audio.RouteNumber = RouteNumber[1] + audio.KilometerMarker = KilometerMarker[1] + } else { + logx.Errorf(fmt.Sprintf("%s:%s", filePath, "鏂囦欢鍐呭鏍煎紡涓嶅")) + return false + } + } + var src string + if strings.HasSuffix(conf.LocalConf.StorePath, "/") { + src = conf.LocalConf.StorePath + fileName + } else { + src = conf.LocalConf.StorePath + "/" + fileName + } + err = os.Rename(filePath, src) + if err != nil { + logx.Errorf(fmt.Sprintf("%s:%s", fileName, "绉诲姩鏂囦欢澶辫触")) + return false + } + audio.TxtFilePath = src + return true + } + + //鎴愬鍙橀噺 + pair := make(map[string]string) FOR: for { select { @@ -186,98 +295,56 @@ continue } if event.Op&fsnotify.Create == fsnotify.Create { - // 鍒ゆ柇鏂囦欢绫诲瀷鏄惁涓�.mp3鎴�.wav - if filepath.Ext(event.Name) == ".mp3" || filepath.Ext(event.Name) == ".wav" { - time.Sleep(time.Second * 1) - //璁剧疆鏂囦欢璁块棶鏉冮檺 - err = os.Chmod(event.Name, 0777) - if err != nil { - logx.Errorf(fmt.Sprintf("%s:%s", event.Name, "璁剧疆鏂囦欢鏉冮檺澶辫触")) + // 鏂囦欢鍚� + fileName := filepath.Base(event.Name) + //鑾峰彇涓嶅甫鎵╁睍鍚嶇殑鏂囦欢鍚� + name := strings.TrimSuffix(fileName, filepath.Ext(fileName)) + //鍒ゆ柇鏂囦欢鍦╬air涓� + if _, ok := pair[name]; !ok { + pair[name] = event.Name + } else { + audio := &models.Audio{} + isOk := true + // 鍒ゆ柇鏂囦欢绫诲瀷鏄惁涓�.mp3鎴�.wav + if filepath.Ext(event.Name) == ".mp3" || filepath.Ext(event.Name) == ".wav" { + isOk = audoF(event.Name, fileName, audio) && txtF(pair[name], audio) } - // 鏂囦欢鍚� - fileName := filepath.Base(event.Name) - //鏍¢獙鏂囦欢鍛藉悕 - arr := strings.Split(fileName, "_") - if len(arr) != 6 { - logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鏂囦欢鍚嶇О閿欒")) + if filepath.Ext(event.Name) == ".txt" { + isOk = audoF(pair[name], filepath.Base(pair[name]), audio) && txtF(event.Name, audio) + } + if !isOk { + delete(pair, name) continue } - timeStr := arr[4] + strings.Split(arr[5], ".")[0] - t, err := time.ParseInLocation("20060102150405", timeStr, time.Local) - if err != nil { - logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鏃堕棿鏍煎紡涓嶅")) - } - - //鏌ラ噸 - _, err = models.NewAudioSearch().SetName(fileName).First() - if err != gorm.ErrRecordNotFound { - logx.Errorf(fmt.Sprintf("%s:%s", fileName, "閲嶅涓婁紶")) - continue - } - - //灏嗘枃浠剁Щ鍔ㄥ埌uploads鏂囦欢澶逛笅 - //鍒ゆ柇storePath涓湯灏炬槸鍚﹀甫 - var src string - if strings.HasSuffix(conf.LocalConf.StorePath, "/") { - src = conf.LocalConf.StorePath + fileName - } else { - src = conf.LocalConf.StorePath + "/" + fileName - } - err = os.Rename(event.Name, src) - if err != nil { - logx.Errorf(fmt.Sprintf("%s:%s", fileName, "绉诲姩鏂囦欢澶辫触")) - continue - } - // 璇诲彇鏂囦欢澶у皬 - fileInfo, err := os.Stat(src) - if err != nil { - logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鑾峰彇鏂囦欢澶у皬澶辫触")) - continue - } - size := fileInfo.Size() - fmt.Println("fileName:", fileName, "size:", size, "src1", src) - - audio := &models.Audio{ - Name: fileName, - Size: size, - FilePath: src, - 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 { - logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鏁版嵁搴揷reate澶辫触")) - continue - } - - 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 + if len(audio.Name) > 0 { + if err = models.NewAudioSearch().Create(audio); err != nil { + logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鏁版嵁搴揷reate澶辫触")) + continue } + go func() { + var trainInfoNames = []string{audio.LocomotiveNumber, audio.TrainNumber, audio.Station} // + 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 + } - }() + }() + } } } case err, ok := <-watcher.Errors: -- Gitblit v1.8.0