package controllers import ( "bytes" "encoding/base64" "fmt" "github.com/gin-gonic/gin" "webserver/extend/code" "webserver/extend/esutil" "webserver/extend/util" "webserver/models" "github.com/satori/go.uuid" "image" "image/jpeg" "log" "mime/multipart" "net/http" ) type FileController struct { } // weedfs 访问路径 //var picIp = "http://192.168.1.182:6080/" var picIp = "http://" var picUrlField = "fileUrl" //var picUrlField = "fid" /**上传方法**/ //var weedfsUri = "http://192.168.1.182:6333/submit" var weedfsUri = "http://192.168.1.182:9500/submit" // @Summary 依据图片添加底库人员 // @Description 依据图片添加底库返回数据人员 // @Accept mpfd // @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}" // @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") 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) } field, 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()) } return } if tableId != "" { // 上传 if result["success"].(bool) { util.ResponseFormat(c, code.Success, result["data"]) } else { util.ResponseFormat(c, code.ServiceInsideError, result["data"]) } } else { util.ResponseFormat(c, code.Success, field) } } // @Description 人员照片上传并获取特征值 // @Router /data/api-v/dbperson/fileUploadTest [POST] func (controller FileController) UploadPersonTest(c *gin.Context){ file, header, err := c.Request.FormFile("file") //image这个是uplaodify参数定义中的 'fileObjName':'image' if err != nil { util.ResponseFormat(c,code.RequestParamError,"参数有误") return } //文件的名称 filename := header.Filename fmt.Println(file, err, filename) if err != nil { log.Fatal(err) filename = uuid.NewV4().String() } } /*// 对上面的编码结果进行base64解码 decodeBytes, err := base64.StdEncoding.DecodeString(encodeString) if err != nil { log.Fatalln(err) }*/ func uploadFileReturnAddr(file multipart.File, filename string, tableId string) (string, map[string]interface{}, error) { defer file.Close() field := "" // weedfs 上传 { fileInfo, e := esutil.PostFormData(weedfsUri, filename, "file", file) if e != nil { fmt.Println(e.Error()) return "", nil, e } else { field = fileInfo[picUrlField].(string) // 文件路径 } } if tableId != "" && field != "" { // 返回特征值 fileInfo["point"] = v.RcFace fileInfo["feature"] = feat /*features := gorun.GetSimpleFaceDetect(picIp+field) // 特征值 // linux if len(features) == 0 { // linux return field,nil,errors.New("NotFeatureFindError") // linux }else if len(features) > 1 { // linux return field,nil,errors.New("TooManyFeatureFindError") // linux } // linux feat := features[0]["feature"].([]byte) // linux if len(feat) != 2560 { // linux return field,nil,errors.New("NotFeatureFindError") } */ // linux feat := []byte("hello world") // windows 测试放开 dbperson := new(models.Dbtablepersons) dbperson.FaceUrl = picIp+field // 图片路经 dbperson.TableId = tableId // dbperson.PersonName = filename // 图片名 // 演示base64编码 encodeString := base64.StdEncoding.EncodeToString(feat) dbperson.Feature = encodeString // 特征值base64 码 result := addDbPerson(dbperson) return field, result, nil } else { return field, nil, nil } } /**上传方法**/ // @Summary 批量添加底库人员 // @Description 依据图片批量添加底库人员 // @Accept mpfd // @Produce json // @Tags dbperson 底库人员 // @Param files formData file[] true "多个底库人员图片" // @Param tableId formData string false "底库id,有id 则加入底库,无则只上传图片" // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true,data:{}}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false,data:null}" // @Router /data/api-v/dbperson/moreFileUpload [POST] func (fc FileController) MoreFileUpload(c *gin.Context) { //得到上传的文件 //image这个是uplaodify参数定义中的 'fileObjName':'image' form, err := c.MultipartForm() tableId := c.Request.FormValue("tableId") fileHeaders := form.File["files"] if err != nil { util.ResponseFormat(c, code.RequestParamError, err.Error()) return } extNames := make([]string, 0) isAllFiald := true addResult := make(map[string]interface{}, 0) details := make([]string, 0) for _, head := range fileHeaders { //文件的名称 filename := head.Filename file, err := head.Open() fmt.Println(file, err, filename) 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()) } } } addResult["isAllFiald"] = isAllFiald addResult["fields"] = extNames addResult["detail"] = details //fields := fdfsclient.UploadFileByBuffer100(bytess, extNames) // fastdfs 上传 if !isAllFiald { util.ResponseFormat(c, code.Success, addResult) } else { util.ResponseFormat(c, code.ServiceInsideError, err.Error()) } } // @Summary 上传图片 并切图 // @Description 上传图片 并切图 // @Accept mpfd // @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}" // @Router /data/api-v/es/ImageUploadReturnPics [POST] func (fc FileController) ImageUploadReturnPics(c *gin.Context) { //得到上传的文件 file, header, err := c.Request.FormFile("file") //image这个是uplaodify参数定义中的 'fileObjName':'image' if err != nil { log.Fatal(err) util.ResponseFormat(c, code.RequestParamError, err.Error()) return } //文件的名称 filename := header.Filename fmt.Println(file, err, filename) defer file.Close() field := "" // weedfs 上传 uploadData := make([]byte, header.Size) i, err2 := file.ReadAt(uploadData, 0) if err2 != nil { fmt.Println("上传返回i:", i) util.ResponseFormat(c, code.UploadFileError, err2.Error()) return } { uri := weedfsUri fileInfo, e := esutil.PostFormBufferData(uri, filename, "file", uploadData) if e != nil { fmt.Println(e.Error()) util.ResponseFormat(c, code.UploadFileError, e.Error()) return // 上传失败 } else { field = fileInfo[picUrlField].(string) // 文件路径 } } // fileInfo["point"] = v.RcFace // 返回特征值 // fileInfo["feature"] = feat //features := gorun.GetSimpleFaceDetect(picIp + "/" + field) // 特征值 只在linux 下 //feat := []byte("hello world") // windows 测试放开 result := make(map[string]interface{}, 0) result["uploadImage"] = picIp+field smUrl := make([]string, 0) //for _, feature := range features { // linux // 获取图片 //point := feature["point"].(gosdk.CRECT) // linux buffer := bytes.NewBuffer(uploadData) m, _, _ := image.Decode(buffer) // 图片文件解码 rgbImg := m.(*image.YCbCr) //subImg := rgbImg.SubImage(image.Rect(int(point.Left),int(point.Bottom),int(point.Right),int(point.Top))).(*image.YCbCr) //图片裁剪x0 y0 x1 y1 linux subImg := rgbImg.SubImage(image.Rect(30, 130, 170, 20)).(*image.YCbCr) //图片裁剪x0 y0 x1 y1 windows emptyBuff := bytes.NewBuffer(nil) //开辟一个新的空buff jpeg.Encode(emptyBuff, subImg, nil) //img写入到buff bytes := emptyBuff.Bytes() fileInfo, e := esutil.PostFormBufferData(weedfsUri, filename, "file", bytes) if e != nil { fmt.Println(e.Error()) util.ResponseFormat(c, code.UploadFileError, e.Error()) return // 上传失败 smUrl = append(smUrl, "一组获取失败") } else { field = fileInfo[picUrlField].(string) // 文件路径 smUrl = append(smUrl, picIp+field) } //} // linux result["smImage"] = smUrl util.ResponseFormat(c, code.Success, result) } /**下载方法**/ func Filedown(c *gin.Context) { //暂时没有提供方法 }