From cc962c1b6ffabd9d41e6db0571efbcc1a4568ce7 Mon Sep 17 00:00:00 2001 From: liuxiaolong <736321739@qq.com> Date: 星期一, 29 七月 2019 11:39:56 +0800 Subject: [PATCH] use mangos req instead of deliver,add recv timeout --- controllers/fileController.go | 264 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 234 insertions(+), 30 deletions(-) diff --git a/controllers/fileController.go b/controllers/fileController.go index adb1e6e..a82d000 100644 --- a/controllers/fileController.go +++ b/controllers/fileController.go @@ -1,6 +1,8 @@ package controllers import ( + "basic.com/dbapi.git" + "basic.com/fileServer/WeedFSClient.git" "basic.com/pubsub/protomsg.git" "bytes" "encoding/base64" @@ -21,6 +23,7 @@ "webserver/extend/code" "webserver/extend/config" "webserver/extend/esutil" + "webserver/extend/logger" "webserver/extend/util" "webserver/models" "webserver/service" @@ -93,6 +96,218 @@ } } + +type FaceExtract struct { + Url string `json:"url"` + FaceBytes []byte `json:"faceBytes"` +} +var faceExtractedMap = make(map[string]FaceExtract,0) + +// @Summary 浜鸿劯鎻愬彇 +// @Description 浜鸿劯鎻愬彇 +// @Produce json +// @Tags 浠ュ浘鎼滃浘 +// @Param file formData file true "浜哄憳鍥剧墖" +// @Success 200 {string} json "{"code":200, msg:"", data:"", success:true}" +// @Failure 500 {string} json "{"code":500, msg:"", data:"", success:false}" +// @Router /data/api-v/dbperson/faceExtract [POST] +func (controller FileController) FaceExtract(c *gin.Context) { + file, _, err := c.Request.FormFile("file") //image杩欎釜鏄痷plaodify鍙傛暟瀹氫箟涓殑 'fileObjName':'image' + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") + return + } + var weedfsUri = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit" + resultMap :=make(map[string]interface{},0) + //灏嗕笂浼犵殑鍥剧墖浜や汉鑴告娴嬪拰浜鸿劯鎻愬彇锛岃幏寰楃壒寰� + fileBytes, _ := ioutil.ReadAll(file) + faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes, time.Second*60) + if err ==nil && len(faceArr) >0 { + //1.鎻愬彇姣忎竴寮犱汉鑴稿皬鍥� + urlArr := make([]string,0) + for _,r := range faceArr { + rcFace := r.Pos.RcFace + cutFaceImgData := util.SubImg(*pI, int(rcFace.Left), int(rcFace.Top), int(rcFace.Right), int(rcFace.Bottom)) + weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", cutFaceImgData) + if e == nil{ + faceExtractedMap[weedFilePath] = FaceExtract{ + Url:weedFilePath, + FaceBytes:r.Feats, + } + urlArr = append(urlArr, weedFilePath) + } + } + //2.澶у浘鐢绘,鏍囪瘑浜鸿劯浣嶇疆 + originFilePath, _ := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", fileBytes) + resultMap["uploadImage"] = originFilePath + resultMap["smImage"] = urlArr + util.ResponseFormat(c,code.Success, resultMap) + } else { + util.ResponseFormat(c,code.ComError,"鏈彁鍙栧埌浜鸿劯") + } +} + +// @Summary 浠ュ浘鎼滃浘 +// @Description 浠ュ浘鎼滃浘 +// @Accept json +// @Produce json +// @Tags 浠ュ浘鎼滃浘 +// @Param condition body models.EsSearch true "鎼滅储鍙傛暟" +// @Success 200 {string} json "{"code":200, msg:"", data:"", success:true}" +// @Failure 500 {string} json "{"code":500, msg:"", data:"", success:false}" +// @Router /data/api-v/dbperson/searchByPhoto [POST] +func (controller FileController) SearchByPhoto(c *gin.Context) { + var searchBody models.EsSearch + err := c.BindJSON(&searchBody) + if err !=nil || searchBody.PicUrl == "" || len(searchBody.DataBases) == 0 { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") + return + } + if searchBody.CompareNum !="" { + //浜屾鎼滅储锛屼笉闇�瑕佸啀姣斿浜� + co := service.GetCompResultByNum(searchBody.CompareNum) + if co != nil { + //浜屾鎼滅储鍜屾帓搴� + twiceM := GetCompareDataTwice(co,&searchBody) + util.ResponseFormat(c,code.Success,twiceM) + } else { + m :=make(map[string]interface{},0) + m["compareNum"] = searchBody.CompareNum + m["total"] = 0 + m["totalList"] = []service.CompareResult{} + util.ResponseFormat(c,code.CompareResultGone,m) + } + } + var sysSetApi dbapi.SysSetApi + analyServerId := "" + flag, sysconf := sysSetApi.GetServerInfo() + if flag { + analyServerId = sysconf.ServerId + } else { + util.ResponseFormat(c, code.ComError, "analyServerId涓虹┖锛岄厤缃湁璇�") + return + } + if face,ok := faceExtractedMap[searchBody.PicUrl];!ok{ + util.ResponseFormat(c, code.RequestParamError, "璇烽噸鏂颁笂浼犲浘鐗�") + return + } else { + arg := protomsg.CompareArgs{ + FaceFeature: face.FaceBytes, + CompareThreshold: searchBody.Threshold, + } + + if searchBody.DataBases !=nil { + for idx,tableId :=range searchBody.DataBases { + if tableId == "esData" { + searchBody.DataBases = append(searchBody.DataBases[:idx], searchBody.DataBases[idx+1:]...) + searchBody.DataBases = append(searchBody.DataBases,service.CaptureTable) + break + } + } + arg.TableIds = searchBody.DataBases + } + arg.Source = true // 鏍囪瘑鏉ユ簮鏄痺eb + arg.AlarmLevel = searchBody.AlarmLevel + arg.Tasks = searchBody.Tasks + arg.TreeNodes = searchBody.TreeNodes + arg.Tabs = searchBody.Tabs + arg.SearchTime = searchBody.SearchTime + arg.InputValue = searchBody.InputValue + arg.Collection = searchBody.Collection + arg.AnalyServerId = analyServerId + + logger.Debug("arg.TableIds:", arg.TableIds, ",alarmLevel:",arg.AlarmLevel,",treeNodes:",arg.TreeNodes,",searchTime:",arg.SearchTime, + ",inputValue:",arg.InputValue,",tasks:",arg.Tasks,",compThreshold:",arg.CompareThreshold) + compareService := service.NewFaceCompareService(arg) + compareOnce := compareService.Compare() + logger.Debug("compareResult:",*compareOnce) + dataList := compareOnce.CompareData + service.SortByScore(dataList) + totalList := len(dataList) + m := make(map[string]interface{},3) + m["compareNum"] = compareOnce.CompareNum + m["total"] = totalList + if totalList <= searchBody.Size { + m["totalList"] = dataList + } else { + m["totalList"] = dataList[0:searchBody.Size] + } + util.ResponseFormat(c,code.Success,m) + } +} + +func GetCompareDataTwice(co *service.CompareOnce,arg *models.EsSearch) map[string]interface{} { + camIds := arg.TreeNodes + tabIds := arg.Tabs + taskIds := arg.Tasks + alarmLevels := arg.AlarmLevel + timeArr := arg.SearchTime + input := arg.InputValue + resultList := make([]service.CompareResult,0) + for _,cr :=range co.CompareData { + if cr.Id !=""{ + n :=0 + if len(camIds) == 0 || isInArr(cr.CameraId,camIds) { + n++ + } + if len(tabIds) == 0 { + n++ + } + if len(taskIds) == 0 || isInArr(cr.TaskId, taskIds) { + n++ + } + //鍒ゆ柇鎶ヨ绛夌骇 + if len(alarmLevels) == 0 { + + } + n++ + //鍒ゆ柇鏃堕棿 + if len(timeArr) == 0 { + + } + n++ + if input == ""{ + + } + n++ + if n == 6 { + resultList = append(resultList,cr) + } + } else { + resultList = append(resultList,cr) + } + } + logger.Debug("GetCompareDataTwice.data:",resultList) + service.SortByScore(resultList) + from := (arg.Page-1)*arg.Size + to := from + arg.Size + lenth := len(resultList) + m := make(map[string]interface{},0) + m["total"] = lenth + m["compareNum"] = arg.CompareNum + + if from < len(resultList) { + if to <= len(resultList) { + m["totalList"] = resultList[from:to] + } else { + m["totalList"] = resultList[from:len(resultList)] + } + } else { + m["totalList"] = []service.CompareResult{} + } + return m +} + +func isInArr(id string,arr []string) bool { + for _,v :=range arr { + if v == id { + return true + } + } + return false +} + + // @Description 浜哄憳鐓х墖涓婁紶骞惰幏鍙栫壒寰佸�� // @Router /data/api-v/dbperson/fileUploadTest [POST] func (controller FileController) UploadPersonTest(c *gin.Context) { @@ -108,7 +323,6 @@ faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes, time.Second*5) if err ==nil && len(faceArr) >0 { var faceBase64= "" - var field = "" var rcFace *protomsg.Rect for _,r := range faceArr { rcFace = r.Pos.RcFace @@ -117,19 +331,12 @@ } //鏍规嵁浜鸿劯鍧愭爣鎵e嚭浜鸿劯灏忓浘 cutFaceImgData := util.SubImg(*pI, int(rcFace.Left), int(rcFace.Top), int(rcFace.Right), int(rcFace.Bottom)) - fileInfo, e := esutil.PostFormData(weedfsUri, "娴嬭瘯浜鸿劯鍒囧浘", "file", cutFaceImgData) - if e != nil { - fmt.Println(e.Error()) - + weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, "testCutFace", cutFaceImgData) + if e !=nil{ + util.ResponseFormat(c,code.ComError,"鏂囦欢涓婁紶澶辫触") } else { - field = fileInfo[picUrlField].(string) // 鏂囦欢璺緞 + util.ResponseFormat(c,code.Success,weedFilePath + ";" + faceBase64) } - if strings.Contains(field,"/"){ - idx := strings.Index(field, "/") - field = field[idx+1:] - } - fmt.Println("field:",field) - util.ResponseFormat(c,code.Success,field + ";" + faceBase64) } else { util.ResponseFormat(c,code.ComError,"鏈彁鍙栧埌浜鸿劯") } @@ -188,6 +395,7 @@ dbperson.PersonPicUrl = field // 鍥剧墖璺粡 dbperson.TableId = tableId // dbperson.PersonName = fileNameOnly // 鍥剧墖鍚� + dbperson.Enable = 1 //榛樿鏈夋晥 // 婕旂ずbase64缂栫爜 dbperson.FaceFeature = faceBase64 // 鐗瑰緛鍊糱ase64 鐮� @@ -241,9 +449,9 @@ return } extNames := make([]string, 0) - isAllFiald := true addResult := make(map[string]interface{}, 0) - details := make([]string, 0) + successList := make([]string, 0) + failList := make([]string,0) for _, head := range fileHeaders { //鏂囦欢鐨勫悕绉� filename := head.Filename @@ -252,27 +460,23 @@ if err != nil { log.Fatal(err) } - //data, _ := ioutil.ReadAll(file) - // weedfs 涓婁紶 + field, _, err1 := uploadFileReturnAddr(file, filename, tableId) - extNames = append(extNames, field) - if isAllFiald && err1 == nil { - isAllFiald = false - } - if err1 != nil { - if field == "" { - details = append(details, filename+"涓婁紶澶辫触,"+err1.Error()) - } else { - details = append(details, filename+"鍔犲叆搴曞簱澶辫触,"+err1.Error()) - } + //extNames = append(extNames, field) + + if err1 != nil || field == "" { + failList = append(failList, filename) + } else { + successList = append(successList, filename) } } - addResult["isAllFiald"] = isAllFiald + addResult["successList"] = successList + addResult["failList"] = failList addResult["fields"] = extNames - addResult["detail"] = details + //addResult["detail"] = details //fields := fdfsclient.UploadFileByBuffer100(bytess, extNames) // fastdfs 涓婁紶 - if !isAllFiald { - util.ResponseFormat(c, code.Success, addResult) + if len(successList)>0 { + util.ResponseFormat(c, code.DbPersonUploadSuccess, addResult) } else { util.ResponseFormat(c, code.ServiceInsideError, err.Error()) } -- Gitblit v1.8.0