sunty
2020-08-20 9303b69ea569bcb5e581147543a3fd58e90d0d25
controllers/fileController.go
@@ -3,22 +3,22 @@
import (
   "basic.com/dbapi.git"
   "basic.com/fileServer/WeedFSClient.git"
   esApi "basic.com/pubsub/esutil.git"
   "basic.com/pubsub/protomsg.git"
   "basic.com/valib/godraw.git"
   "basic.com/valib/logger.git"
   "bytes"
   "encoding/base64"
   "encoding/json"
   "errors"
   "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"
@@ -29,11 +29,9 @@
   "webserver/extend/code"
   "webserver/extend/config"
   "webserver/extend/esutil"
   "basic.com/valib/logger.git"
   "webserver/extend/util"
   "webserver/models"
   "webserver/service"
   esApi "basic.com/pubsub/esutil.git"
)
type FileController struct {
@@ -51,57 +49,64 @@
//var weedfsUri = "http://192.168.1.182:9500/submit"
// @Security ApiKeyAuth
// @Summary 依据图片添加底库人员
// @Description  依据图片添加底库返回数据人员
// @Summary 图片上传
// @Description  图片上传
// @Accept  multipart/form-data
// @Produce json
// @Tags dbperson 底库人员
// @Param file formData file true "底库人员图片"
// @Param tableId formData string false "底库id,有id 则加入底库,无则只上传图片"
// @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}"
// @Failure 500 {string} json "{"code":500,  msg:"返回错误信息", success:false}"
// @Tags 图片上传
// @Param file formData file true "图片"
// @Param picType formData string true "图片类型,0:车辆照片,1:人脸照片"
// @Success 200 {string} json "{"code":200, msg:"", success:true}"
// @Failure 500 {string} json "{"code":500, msg:"", success:false}"
// @Router /data/api-v/dbperson/fileupload [POST]
func (fc FileController) Fileupload(c *gin.Context) {
   //得到上传的文件
   file, header, err := c.Request.FormFile("file") //image这个是uplaodify参数定义中的   'fileObjName':'image'
   tableId := c.Request.FormValue("tableId")
   if err != nil {
      c.String(http.StatusBadRequest, "Bad request")
   picType := c.Request.FormValue("picType") //图片类型
   if err != nil || (picType != "0" && picType != "1") {
      util.ResponseFormat(c, code.RequestParamError, "参数有误")
      return
   }
   //文件的名称
   filename := header.Filename
   fmt.Println(file, err, filename)
   if err != nil {
      log.Fatal(err)
      filename = uuid.NewV4().String()
   }
   // fastdfs
   {
      //fileSuffix := path.Ext(filename)[1:] //获取文件后缀
      //fmt.Println("文件后缀 =", fileSuffix)
      //data, _ := ioutil.ReadAll(file)
      // fastdfs 上传  暂废弃
      //field := fdfsclient.UploadFileByBuffer(data, fileSuffix)
   }
   fileNameOnly, result, err := uploadFileReturnAddr(file, filename, tableId)
   if err != nil {
      if err.Error() == "NotFeatureFindError" {
         util.ResponseFormat(c, code.NotFeatureFindError, filename)
      } else {
         util.ResponseFormat(c, code.ServiceInsideError, err.Error())
   var result = make(map[string]string)
   if picType == "1" {
      _, _, err, faceFeature, faceUrlPath := uploadFileReturnAddr(file, filename, "", false)
      if err != nil {
         if err.Error() == "NotFeatureFindError" {
            util.ResponseFormat(c, code.NotFeatureFindError, filename)
         } else {
            util.ResponseFormat(c, code.ServiceInsideError, err.Error())
         }
         return
      }
      return
   }
   if tableId != "" { //  上传
      if result["success"].(bool) {
         util.ResponseFormat(c, code.Success, result["data"])
      } else {
         util.ResponseFormat(c, code.ServiceInsideError, result["data"])
      }
      result["picUrl"] = faceUrlPath
      result["faceFeature"] = faceFeature
   } else {
      util.ResponseFormat(c, code.Success, fileNameOnly)
      localConf, err2 := cache.GetServerInfo()
      if err2 !=nil || localConf.WebPicIp == "" {
         logger.Debug("localConfig is wrong!!!")
         util.ResponseFormat(c,code.ComError,"")
         return
      }
      defer file.Close()
      // weedfs 上传
      fileBytes, err := ioutil.ReadAll(file)
      if err !=nil {
         util.ResponseFormat(c,code.ComError,"")
         return
      }
      var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent"
      weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, filename, fileBytes)
      if e != nil {
         logger.Debug("WeedFSClient.UploadFile err:", e)
         util.ResponseFormat(c,code.ComError,"UploadFile err")
         return
      }
      result["picUrl"] = weedFilePath
   }
   util.ResponseFormat(c, code.Success, result)
}
@@ -132,7 +137,7 @@
      logger.Debug("localConfig is wrong!!!")
      return
   }
   var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit"
   var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent"
   logger.Debug("weedfsUri:",weedfsUri)
   resultMap :=make(map[string]interface{},0)
   //将上传的图片交人脸检测和人脸提取,获得特征
@@ -143,7 +148,11 @@
      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))
         cutFaceImgData,cutErr := util.SubCutImg(pI, rcFace, 20)
         if cutErr != nil {
            logger.Debug("util.SubCutImg err:", cutErr)
            continue
         }
         weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", cutFaceImgData)
         if e == nil{
            faceExtractedMap[weedFilePath] = FaceExtract{
@@ -166,19 +175,19 @@
}
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}
   img,err := godraw.ToImage(i.Data, int(i.Width), int(i.Height))
   if err != nil {
      return nil,err
   }
   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)
      util.DrawRect(img.(*image.RGBA),int(faceResult.Pos.RcFace.Left),int(faceResult.Pos.RcFace.Top),int(faceResult.Pos.RcFace.Right),
         int(faceResult.Pos.RcFace.Bottom), red)
   }
   fData,err := gocv.IMEncode(".jpg", rook)
   return &fData,err
   quantity := 100
   jpgData, err := godraw.ImageToJpeg(img, &quantity)
   return &jpgData,err
}
type CompareResult struct {
@@ -403,12 +412,12 @@
      logger.Debug("localConfig is wrong!!!")
      return nil,"",nil,errors.New("localConf err")
   }
   var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit"
   var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent"
   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))
      cutFaceImgData,_ := util.SubCutImg(pI, rcFace, 20)
      weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", cutFaceImgData)
      if e == nil{
         faceExtractedMap[weedFilePath] = FaceExtract{
@@ -487,6 +496,9 @@
               return
            }
            faceB = decodeF
         } else {
            util.ResponseFormat(c, code.ComError, "本条人脸抓拍特征为空,请检查")
            return
         }
      }
@@ -742,7 +754,7 @@
      logger.Debug("localConfig is wrong!!!")
      return
   }
   var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit"
   var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent"
   //将上传的图片交人脸检测和人脸提取,获得特征
   fileBytes, _ := ioutil.ReadAll(file)
@@ -756,7 +768,7 @@
         break
      }
      //根据人脸坐标扣出人脸小图
      cutFaceImgData := util.SubImg(*pI, int(rcFace.Left), int(rcFace.Top), int(rcFace.Right), int(rcFace.Bottom))
      cutFaceImgData,_ := util.SubCutImg(pI, rcFace, 20)
      weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, "testCutFace", cutFaceImgData)
      if e !=nil{
         util.ResponseFormat(c,code.ComError,"文件上传失败")
@@ -774,24 +786,24 @@
log.Fatalln(err)
}*/
func uploadFileReturnAddr(file multipart.File, filename string, tableId string) (string, map[string]interface{}, error) {
func uploadFileReturnAddr(file multipart.File, filename string, tableId string, add2Db bool) (string, map[string]interface{}, error, string, string) {
   defer file.Close()
   // weedfs 上传
   fileBytes, err := ioutil.ReadAll(file)
   if err !=nil {
      return "",nil,err
      return "",nil,err,"",""
   }
   //将上传的图片交人脸检测和人脸提取,获得特征
   var faceBase64=""
   faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes, time.Second*5)
   if faceArr ==nil {
      return "",nil,errors.New("NotFeatureFindError")
      return "",nil,errors.New("NotFeatureFindError"),"",""
   }
   var rcFace *protomsg.Rect
   if err ==nil && len(faceArr) >0 {
      if len(faceArr) >1 {
         return "",nil, errors.New("TooManyFaces")
         return "",nil, errors.New("TooManyFaces"),"",""
      }
      for _,r := range faceArr {
         //拿到人脸的坐标
@@ -804,12 +816,16 @@
   localConf, err2 := cache.GetServerInfo()
   if err2 !=nil || localConf.WebPicIp == "" {
      logger.Debug("localConfig is wrong!!!")
      return "",nil,err2
      return "",nil,err2,"",""
   }
   var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit"
   var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent"
   //根据人脸坐标扣出人脸小图
   t1 := time.Now()
   cutFaceImgData := util.SubImg(*pI, int(rcFace.Left), int(rcFace.Top), int(rcFace.Right), int(rcFace.Bottom))
   cutFaceImgData,cutErr := util.SubCutImg(pI, rcFace, 20)
   if cutErr != nil {
      logger.Debug("util.SubCutImg err:", cutErr)
      return "", nil, cutErr,"",""
   }
   logger.Debug("SubImg用时:", time.Since(t1))
   t1 = time.Now()
   weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, filename, cutFaceImgData)
@@ -817,22 +833,26 @@
   t1 = time.Now()
   if e != nil {
      logger.Debug("WeedFSClient.UploadFile err:", e)
      return "", nil, e
      return "", nil, e,"",""
   }
   ext := path.Ext(filename)
   fileNameOnly := strings.TrimSuffix(filename, ext)
   dbperson := new(models.Dbtablepersons)
   dbperson.PersonPicUrl = weedFilePath //  图片路经
   dbperson.TableId = tableId           //
   dbperson.PersonName = fileNameOnly       // 图片名
   dbperson.Enable = 1 //默认有效
   dbperson.FaceFeature = faceBase64 // 特征值base64 码
   var result map[string]interface{}
   if add2Db {
      dbperson := new(models.Dbtablepersons)
      dbperson.PersonPicUrl = weedFilePath //  图片路经
      dbperson.TableId = tableId           //
      dbperson.PersonName = fileNameOnly       // 图片名
      dbperson.Enable = 1 //默认有效
      dbperson.FaceFeature = faceBase64 // 特征值base64 码
   result := addDbPerson(dbperson)
   logger.Debug("addDbPerson用时:", time.Since(t1))
   return fileNameOnly, result, nil
      result = addDbPerson(dbperson)
   }
   logger.Debug("addDbPerson用时:", time.Since(t1), "result:", result)
   return fileNameOnly, result, nil,faceBase64, weedFilePath
}
@@ -889,7 +909,7 @@
            lock.Unlock()
            return
         }
         field, _, err1 := uploadFileReturnAddr(file, filename, tableId)
         field, _, err1,_,_ := uploadFileReturnAddr(file, filename, tableId, true)
         lock.Lock()
         if err1 != nil || field == "" {
            if err1 !=nil && err1.Error() == "NotFeatureFindError" {
@@ -966,7 +986,7 @@
      logger.Debug("localConfig is wrong!!!")
      return
   }
   var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit"
   var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent"
   {
      uri := weedfsUri
      fileInfo, e := esutil.PostFormBufferData(uri, filename, "file", uploadData)