From eb2c3a8890a0e9695c0cd2bc3b3dc310c6fbcfa9 Mon Sep 17 00:00:00 2001 From: liuxiaolong <736321739@qq.com> Date: 星期六, 26 十月 2019 11:28:23 +0800 Subject: [PATCH] fix user timeout --- controllers/fileController.go | 683 +++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 494 insertions(+), 189 deletions(-) diff --git a/controllers/fileController.go b/controllers/fileController.go index 0d85099..f46d244 100644 --- a/controllers/fileController.go +++ b/controllers/fileController.go @@ -10,23 +10,29 @@ "fmt" "github.com/gin-gonic/gin" "github.com/satori/go.uuid" + "gocv.io/x/gocv" "image" + "image/color" "image/jpeg" "io/ioutil" "log" "mime/multipart" "net/http" "path" + "sort" "strconv" "strings" + "sync" "time" + "webserver/cache" "webserver/extend/code" "webserver/extend/config" "webserver/extend/esutil" - "webserver/extend/logger" + "basic.com/valib/logger.git" "webserver/extend/util" "webserver/models" "webserver/service" + esApi "basic.com/pubsub/esutil.git" ) type FileController struct { @@ -117,7 +123,13 @@ util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") return } - var weedfsUri = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit" + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" + logger.Debug("weedfsUri:",weedfsUri) resultMap :=make(map[string]interface{},0) //灏嗕笂浼犵殑鍥剧墖浜や汉鑴告娴嬪拰浜鸿劯鎻愬彇锛岃幏寰楃壒寰� fileBytes, _ := ioutil.ReadAll(file) @@ -138,12 +150,221 @@ } } //2.澶у浘鐢绘,鏍囪瘑浜鸿劯浣嶇疆 - originFilePath, _ := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", fileBytes) + drawedB, _ := drawPolygonOnImg(pI, &faceArr) + + originFilePath, _ := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", *drawedB) resultMap["uploadImage"] = originFilePath resultMap["smImage"] = urlArr util.ResponseFormat(c,code.Success, resultMap) } else { util.ResponseFormat(c,code.ComError,"鏈彁鍙栧埌浜鸿劯") + } +} + +func drawPolygonOnImg(i *protomsg.Image,faceArr *[]*protomsg.ResultFaceDetect) (*[]byte,error) { + rook, _ := gocv.NewMatFromBytes(int(i.Height), int(i.Width), gocv.MatTypeCV8UC3, i.Data) + defer rook.Close() + //yellow := color.RGBA{255, 255, 0, 0} + red := color.RGBA{255, 0, 0, 0} + for _,faceResult := range *faceArr { + left := int(faceResult.Pos.RcFace.Left) + top := int(faceResult.Pos.RcFace.Top) + right := int(faceResult.Pos.RcFace.Right) + bottom := int(faceResult.Pos.RcFace.Bottom) + gocv.Rectangle(&rook, image.Rect(left,top,right,bottom), red, 1) + } + fData,err := gocv.IMEncode(".jpg", rook) + return &fData,err +} + +type CompareResult struct { + Id string `json:"id"` + CompareScore float32 `json:"compareScore"` + CameraId string `json:"cameraId"` + CameraAddr string `json:"cameraAddr"` + PicDate string `json:"picDate"` + Content string `json:"content"` + IsAlarm int `json:"isAlarm"` + PicMaxUrl string `json:"picMaxUrl"` + PicSmUrl []string `json:"picSmUrl"` + Sex string `json:"sex"` + AgeDescription string `json:"ageDescription"` + Race string `json:"race"` + TaskId string `json:"taskId"` + TaskName string `json:"taskName"` + BaseInfo []DbPersonVo `json:"baseInfo"` + VideoUrl string `json:"videoUrl"` + SdkName string `json:"sdkName"` +} +type DbPersonVo struct { + BwType string `json:"bwType"` + CompareScore float32 `json:"compareScore"` + IdCard string `json:"idCard"` + MonitorLevel string `json:"monitorLevel"` + PersonId string `json:"personId"` + PersonName string `json:"personName"` + PersonPicUrl string `json:"personPicUrl"` + PhoneNum string `json:"phoneNum"` + Sex string `json:"sex"` + TableId string `json:"tableId"` + TableName string `json:"tableName"` + Enable int32 `json:"enable"` +} + +type ScoreIndex struct { + CompareScore float32 + Index int +} + +//濉厖鍚戝墠绔繑鍥炵殑鏁版嵁 +func FillDataToCompareResult(compResult *protomsg.SdkCompareResult) []CompareResult { + + var resultList = make([]CompareResult, len(compResult.CompareResult)) + dbPersonM := make(map[string]ScoreIndex, 0) + captureM := make(map[string]ScoreIndex, 0) + personIds := make([]string,0) + captureIds := make([]string,0) + for idx,v :=range compResult.CompareResult{ + if v.Tableid == service.CaptureTable { + captureM[v.Id] = ScoreIndex{ + Index: idx, + CompareScore: v.CompareScore, + } + captureIds = append(captureIds,v.Id) + } else { + dbPersonM[v.Id] = ScoreIndex{ + Index: idx, + CompareScore: v.CompareScore, + } + personIds = append(personIds,v.Id) + } + } + logger.Debug("comp len(personIds):", len(personIds)) + logger.Debug("comp len(captureIds):", len(captureIds)) + + var dbpersons []protomsg.Dbperson + if len(personIds) >0 { + var dbpApi dbapi.DbPersonApi + dbpersons, _ = dbpApi.Dbpersoninfosbyid(personIds) + } + + if len(dbpersons) >0 { + var dtApi dbapi.DbTableApi + for _,p :=range dbpersons { + var dbP = DbPersonVo { + PersonId: p.Id, + IdCard: p.IdCard, + CompareScore: util.ParseScore(dbPersonM[p.Id].CompareScore), + MonitorLevel: p.MonitorLevel, + PersonName: p.PersonName, + PersonPicUrl: p.PersonPicUrl, + PhoneNum: p.PhoneNum, + Sex: p.Sex, + TableId: p.TableId, + Enable: p.Enable, + } + dbTableInfos, _ := dtApi.DbtablesById([]string{ p.TableId }) + if dbTableInfos !=nil{ + dbP.BwType = dbTableInfos[0].BwType + dbP.TableName = dbTableInfos[0].TableName + } + + resultList[dbPersonM[p.Id].Index] = CompareResult{ + BaseInfo:[]DbPersonVo{ dbP }, + } + } + } + if len(captureIds) >0 { + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.AlarmIp == "" || localConf.ServerId == "" { + logger.Debug("localConfig is wrong!!!") + return nil + } + logger.Debug("captureIds:",strings.Join(captureIds,",")) + videopersons, _ := esApi.Videopersonsinfosbyid(captureIds, config.EsInfo.EsIndex.VideoPersons.IndexName, localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort))) + logger.Debug("comp videoPersons.len:",len(videopersons)) + for _,vp :=range videopersons { + isAlarmInt, _ := strconv.Atoi(vp.IsAlarm) + bi := make([]DbPersonVo,0) + for _,p :=range vp.BaseInfo { + bi = append(bi, DbPersonVo{ + PersonId: p.PersonId, + IdCard: p.IdCard, + CompareScore: util.ParseScore(p.CompareScore), + MonitorLevel: parseMonitorLevel(p.MonitorLevel), + PersonName: p.PersonName, + PersonPicUrl: p.PersonPicUrl, + PhoneNum: p.PhoneNum, + Sex: p.Sex, + TableId: p.TableId, + BwType: strconv.Itoa(int(p.BwType)), + TableName: p.TableName, + }) + } + vpE := CompareResult{ + Id: vp.Id, + CompareScore: util.ParseScore(captureM[vp.Id].CompareScore), + CameraId: vp.CameraId, + CameraAddr: vp.CameraAddr, + PicDate: vp.PicDate, + PicMaxUrl: vp.PicMaxUrl, + PicSmUrl: vp.PicSmUrl, + IsAlarm: isAlarmInt, + Sex: vp.Sex, + AgeDescription: vp.AgeDescription, + Race: vp.Race, + TaskName: vp.TaskName, + TaskId: vp.TaskId, + VideoUrl: vp.VideoUrl, + BaseInfo: bi, + SdkName: "浜鸿劯", + } + resultList[captureM[vp.Id].Index] = vpE + } + } + return resultList +} + +func parseMonitorLevel(level string) string { + if level == "1" { + return "涓�绾�" + } + if level == "2" { + return "浜岀骇" + } + if level == "3" { + return "涓夌骇" + } + return level +} + +func GetFeaFromOneFaceImg(fileBytes []byte) (faceB []byte,oriImg string,smImgs []string, err error){ + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return nil,"",nil,errors.New("localConf err") + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" + logger.Debug("weedfsUri:",weedfsUri) + faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes, time.Second*60) + if err ==nil && len(faceArr) ==1 { + rcFace := faceArr[0].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:faceArr[0].Feats, + } + smImgs = append(smImgs, weedFilePath) + } + //2.澶у浘鐢绘,鏍囪瘑浜鸿劯浣嶇疆 + drawedB, _ := drawPolygonOnImg(pI, &faceArr) + + originFilePath, _ := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", *drawedB) + return faceArr[0].Feats,originFilePath,smImgs,nil + } else { + return nil,"",nil,errors.New("no face") } } @@ -156,151 +377,223 @@ // @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) { +func (fc FileController) SearchByPhoto(c *gin.Context) { var searchBody models.EsSearch err := c.BindJSON(&searchBody) - if err !=nil || searchBody.PicUrl == "" || len(searchBody.DataBases) == 0 { + if err !=nil{ 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涓虹┖锛岄厤缃湁璇�") + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.AlarmIp == "" || localConf.ServerId == "" { + logger.Debug("localConfig is wrong!!!") + util.ResponseFormat(c,code.ComError,"localConf wrong") return } - if face,ok := faceExtractedMap[searchBody.PicUrl];!ok{ + var faceB []byte + logger.Debug("compTargetId:",searchBody.CompTargetId,",compTargetType:",searchBody.CompTargetType) + if searchBody.CompTargetId != "" {//鍋氭煡鎵炬浜�,鎸夋姄鎷嶇殑浜鸿劯鎴栬�呭簳搴撶殑浜鸿劯浠ュ浘鎼滃浘 + if searchBody.CompTargetType == 0 {//鏈紶浜鸿劯鏄簳搴撲汉鑴� + var dbpApi dbapi.DbPersonApi + dbPersons, e := dbpApi.Dbpersoninfosbyid([]string{searchBody.CompTargetId}) + if e ==nil && dbPersons !=nil && len(dbPersons) ==1 { + searchBase64Fea := dbPersons[0].FaceFeature + if searchBase64Fea != "" { + decodeF, err := base64.StdEncoding.DecodeString(dbPersons[0].FaceFeature) + if err !=nil { + util.ResponseFormat(c, code.ComError, "鏈潯搴曞簱浜哄憳鐗瑰緛涓嶆槸base64锛岃妫�鏌�") + return + } + faceB = decodeF + } else { + util.ResponseFormat(c, code.ComError, "鏈潯搴曞簱浜哄憳鐗瑰緛涓虹┖锛岃妫�鏌�") + return + } + } else { + util.ResponseFormat(c, code.ComError, "搴曞簱浜哄憳鏌ヨ澶辫触锛岃妫�鏌�") + return + } + } else { + searchBase64Fea, err := esApi.GetVideoPersonFaceFeatureById(searchBody.CompTargetId, config.EsInfo.EsIndex.VideoPersons.IndexName, localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort))) + if err !=nil { + util.ResponseFormat(c, code.ComError, "鎶撴媿鏁版嵁涓嶅瓨鍦紝璇锋鏌�") + return + } + + if searchBase64Fea !=""{ + decodeF, err := base64.StdEncoding.DecodeString(searchBase64Fea) + if err !=nil { + util.ResponseFormat(c, code.ComError, "鏈潯鎶撴�曠壒寰佷笉鏄痓ase64锛岃妫�鏌�") + return + } + faceB = decodeF + } + } + + } else {//鍋氫互鍥炬悳鍥� + if searchBody.PicUrl == "" || len(searchBody.DataBases) == 0 { + util.ResponseFormat(c, code.RequestParamError, "浠ュ浘鎼滃浘PicUrl涓嶈兘涓虹┖") + return + } + if face,ok := faceExtractedMap[searchBody.PicUrl];!ok{ + util.ResponseFormat(c, code.RequestParamError, "浜鸿劯鐗瑰緛鏈娴嬶紝璇烽噸鏂颁笂浼犲浘鐗�") + return + } else { + faceB = face.FaceBytes + } + } + + if faceB == nil { 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) - timeStart := time.Now() - - compareService := service.NewFaceCompareService(arg) - compareOnce := compareService.Compare() - //logger.Debug("compareResult.len:",*compareOnce) - dataList := compareOnce.CompareData - - logger.Debug("姣斿缁撴潫锛岀敤鏃讹細",time.Since(timeStart)) - - 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] - } - logger.Debug("姣斿鍔犳帓搴忚繑鍥炵敤鏃�:", time.Since(timeStart)) - util.ResponseFormat(c,code.Success,m) } + arg := protomsg.CompareArgs{ + FaceFeature: faceB, + CompareThreshold: searchBody.Threshold, + } + + var hasCompEsPerson = false + if searchBody.DataBases !=nil { + for idx,tableId :=range searchBody.DataBases { + if tableId == "esData" { + searchBody.DataBases = append(searchBody.DataBases[:idx], searchBody.DataBases[idx+1:]...) + hasCompEsPerson = true + break + } + } + arg.TableIds = searchBody.DataBases + } else { + arg.TableIds = []string{} + } + 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 = localConf.ServerId + + logger.Debug("arg.TableIds:", arg.TableIds, ",alarmLevel:",arg.AlarmLevel,",treeNodes:",arg.TreeNodes,",searchTime:",arg.SearchTime, + ",inputValue:",arg.InputValue,",tasks:",arg.Tasks,",compThreshold:",arg.CompareThreshold) + timeStart := time.Now() + + compareService := service.NewFaceCompareService(arg) + var totalData service.CompareList + if len(arg.TableIds) >0 {//鏈夋瘮瀵瑰簳搴� + dbPersonTargets := compareService.CompareDbPersons() + if dbPersonTargets !=nil { + totalData = append(totalData,*dbPersonTargets...) + } + } + if hasCompEsPerson {//鏈夋瘮瀵笶s鎶撴媿 + esPersons := compareService.CompareVideoPersons() + if esPersons !=nil { + totalData = append(totalData, *esPersons...) + } + } + + logger.Debug("comp 姣斿缁撴潫锛岀敤鏃讹細",time.Since(timeStart)) + service.SetCompResultByNum(&service.CompareOnce{ + CompareNum: compareService.CompareNum, + CompareData: &totalData, + }) + + m := make(map[string]interface{},3) + if totalData != nil && totalData.Len() > 0{ + sort.Sort(totalData) + total := totalData.Len() + + m["compareNum"] = compareService.CompareNum + m["total"] = total + var sCompResult protomsg.SdkCompareResult + if total <= searchBody.Size { + sCompResult.CompareResult = totalData + } else { + sCompResult.CompareResult = totalData[0:searchBody.Size] + } + resultList := FillDataToCompareResult(&sCompResult) + m["totalList"] = resultList + logger.Debug("comp 姣斿鍔犳帓搴忚繑鍥炵敤鏃�:", time.Since(timeStart)) + + } else { + m["total"] = 0 + m["compareNum"] = compareService.CompareNum + m["totalList"] = []CompareResult{} + } + 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 { + //camIds := arg.TreeNodes + //tabIds := arg.Tabs + //taskIds := arg.Tasks + //alarmLevels := arg.AlarmLevel + //timeArr := arg.SearchTime + //input := arg.InputValue + //resultList := make([]CompareResult,0) + //for _,each :=range *co.CompareData { + // if each.Id !=""{ + // n :=0 + // if len(camIds) == 0 || isInArr(each.CameraId,camIds) { + // n++ + // } + // if len(tabIds) == 0 { + // n++ + // } + // if len(taskIds) == 0 || isInArr(each.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) + // } + //} - } - 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) + //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)] - } + var sCompResult protomsg.SdkCompareResult + total := len(*co.CompareData) + if total <= to { + sCompResult.CompareResult = (*co.CompareData)[from:total] } else { - m["totalList"] = []service.CompareResult{} + sCompResult.CompareResult = (*co.CompareData)[from:to] } + resultList := FillDataToCompareResult(&sCompResult) + + m := make(map[string]interface{},0) + m["total"] = total + m["compareNum"] = arg.CompareNum + m["totalList"] = resultList + //if from < len(resultList) { + // if to <= len(resultList) { + // m["totalList"] = resultList[from:to] + // } else { + // lte := len(resultList) + // m["totalList"] = resultList[from:lte] + // } + //} else { + // m["totalList"] = []CompareResult{} + //} return m } @@ -322,7 +615,12 @@ util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") return } - var weedfsUri = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit" + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" //灏嗕笂浼犵殑鍥剧墖浜や汉鑴告娴嬪拰浜鸿劯鎻愬彇锛岃幏寰楃壒寰� fileBytes, _ := ioutil.ReadAll(file) @@ -356,7 +654,6 @@ func uploadFileReturnAddr(file multipart.File, filename string, tableId string) (string, map[string]interface{}, error) { defer file.Close() - field := "" // weedfs 涓婁紶 fileBytes, err := ioutil.ReadAll(file) if err !=nil { @@ -371,6 +668,9 @@ } var rcFace *protomsg.Rect if err ==nil && len(faceArr) >0 { + if len(faceArr) >1 { + return "",nil, errors.New("TooManyFaces") + } for _,r := range faceArr { //鎷垮埌浜鸿劯鐨勫潗鏍� rcFace = r.Pos.RcFace @@ -379,58 +679,40 @@ break } } - var weedfsUri = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit" + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return "",nil,err2 + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" //鏍规嵁浜鸿劯鍧愭爣鎵e嚭浜鸿劯灏忓浘 + t1 := time.Now() cutFaceImgData := util.SubImg(*pI, int(rcFace.Left), int(rcFace.Top), int(rcFace.Right), int(rcFace.Bottom)) - fileInfo, e := esutil.PostFormData(weedfsUri, filename, "file", cutFaceImgData) + logger.Debug("SubImg鐢ㄦ椂锛�", time.Since(t1)) + t1 = time.Now() + weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, filename, cutFaceImgData) + logger.Debug("涓婁紶鍒皐eedfs鐢ㄦ椂:", time.Since(t1)) + t1 = time.Now() if e != nil { - fmt.Println(e.Error()) + logger.Debug("WeedFSClient.UploadFile err:", e) return "", nil, e - } else { - field = fileInfo[picUrlField].(string) // 鏂囦欢璺緞 } - if strings.Contains(field,"/"){ - idx := strings.Index(field, "/") - field = field[idx+1:] - } - fmt.Println("field:",field) + ext := path.Ext(filename) fileNameOnly := strings.TrimSuffix(filename, ext) dbperson := new(models.Dbtablepersons) - dbperson.PersonPicUrl = field // 鍥剧墖璺粡 + dbperson.PersonPicUrl = weedFilePath // 鍥剧墖璺粡 dbperson.TableId = tableId // dbperson.PersonName = fileNameOnly // 鍥剧墖鍚� dbperson.Enable = 1 //榛樿鏈夋晥 - // 婕旂ずbase64缂栫爜 - dbperson.FaceFeature = faceBase64 // 鐗瑰緛鍊糱ase64 鐮� result := addDbPerson(dbperson) + logger.Debug("addDbPerson鐢ㄦ椂锛�", time.Since(t1)) return fileNameOnly, result, nil } - -//func getFaceFeaFromSdk(fileBytes []byte) ([]*protomsg.ResultFaceExtCom,error,*protomsg.Image){ -// s := service.NewFaceSdkService(fileBytes) -// i, err := s.ReadFromUploadImg() -// if err !=nil{ -// fmt.Println("readFromUploadImg err:",err) -// return nil,err,i -// } -// bc, err := service.ImgCompress(i) -// if err !=nil { -// fmt.Println("ImgCompress err:",err) -// return nil,err,i -// } -// s.PushImgMsg(bc) -// s.GetFaceFea() -// if s.Result == nil{ -// return nil,errors.New("no fea"),i -// } else { -// return s.Result,nil,i -// } -//} /**涓婁紶鏂规硶**/ @@ -458,34 +740,52 @@ addResult := make(map[string]interface{}, 0) successList := make([]string, 0) failList := make([]string,0) + tAllStart := time.Now() + var wg sync.WaitGroup + var lock sync.Mutex for _, head := range fileHeaders { - //鏂囦欢鐨勫悕绉� - filename := head.Filename - file, err := head.Open() - fmt.Println(file, err, filename) - if err != nil { - log.Fatal(err) - } - - field, _, err1 := uploadFileReturnAddr(file, filename, tableId) - //extNames = append(extNames, field) - - if err1 != nil || field == "" { - failList = append(failList, filename) - } else { - successList = append(successList, filename) - } + wg.Add(1) + go func(head *multipart.FileHeader,tableId string) { + defer wg.Done() + tIStart := time.Now() + filename := head.Filename + fileExt := path.Ext(filename) + fileExt = strings.ToLower(fileExt) + if fileExt !=".jpg" && fileExt != ".jpeg" && fileExt != ".png" { + lock.Lock() + failList = append(failList, filename) + lock.Unlock() + return + } + file, err := head.Open() + if err != nil { + lock.Lock() + failList = append(failList, filename) + lock.Unlock() + return + } + field, _, err1 := uploadFileReturnAddr(file, filename, tableId) + lock.Lock() + if err1 != nil || field == "" { + failList = append(failList, filename) + } else { + successList = append(successList, filename) + } + lock.Unlock() + logger.Debug(filename,"鍒囧浘鐢ㄦ椂锛�",time.Since(tIStart)) + }(head, tableId) + wg.Wait() } + logger.Debug("鍒�",len(fileHeaders),"寮犱汉鑴哥敤鏃讹細", time.Since(tAllStart)) addResult["successList"] = successList addResult["failList"] = failList addResult["fields"] = extNames - //addResult["detail"] = details - //fields := fdfsclient.UploadFileByBuffer100(bytess, extNames) // fastdfs 涓婁紶 - if len(successList)>0 { + + //if len(successList)>0 { util.ResponseFormat(c, code.DbPersonUploadSuccess, addResult) - } else { - util.ResponseFormat(c, code.ServiceInsideError, err.Error()) - } + //} else { + // util.ResponseFormat(c, code.DbPersonUploadFail, addResult) + //} } type EsPersonSave struct { @@ -527,7 +827,12 @@ util.ResponseFormat(c, code.UploadFileError, err2.Error()) return } - var weedfsUri = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit" + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" { uri := weedfsUri fileInfo, e := esutil.PostFormBufferData(uri, filename, "file", uploadData) -- Gitblit v1.8.0