package util import ( "archive/zip" "bytes" "crypto/md5" "encoding/hex" "encoding/json" "image" "io" "io/ioutil" "net/http" "os" "path/filepath" "strconv" "time" "webserver/extend/code" "basic.com/pubsub/protomsg.git" "github.com/gin-gonic/gin" "github.com/golang/glog" "github.com/pierrec/lz4" "gocv.io/x/gocv" "crypto/rand" "fmt" "reflect" "strings" ) // iterater field of struct to lowcast. // return type: string slice. func FiledbyStuct(stuct interface{}) []string { var strtmp []string t := reflect.TypeOf(stuct) for i := 0; i < t.NumField(); i++ { strtmp = append(strtmp, strings.ToLower(string(t.Field(i).Name))) } return strtmp } // // ResponseFormat 返回数据格式化 func ResponseFormat(c *gin.Context, respStatus *code.Code, data interface{}) { if respStatus == nil { glog.Error("response status param not found!") respStatus = code.RequestParamError } c.JSON(respStatus.Status, gin.H{ "code": respStatus.Status, "success": respStatus.Success, "msg": respStatus.Message, "data": data, }) return } func PseudoUuid() (uuid string) { b := make([]byte, 16) rand.Read(b) uuid = fmt.Sprintf("%X-%X-%X-%X-%X", b[0:4], b[4:6], b[6:8], b[8:10], b[10:]) return } //struct转map func Struct2Map(obj interface{}) map[string]interface{} { resultMap := make(map[string]interface{}, 0) bytesData, err := json.Marshal(obj) if err != nil { return resultMap } json.Unmarshal(bytesData, &resultMap) return resultMap // //t := reflect.TypeOf(obj) //v := reflect.ValueOf(obj) // //var data = make(map[string]interface{}) //for i := 0; i < t.NumField(); i++ { // data[t.Field(i).Name] = v.Field(i).Interface() //} //return data } func ReadImgData(url string) ([]byte, error) { resp, err := http.Get(url) if err != nil { return nil, err } defer resp.Body.Close() pix, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } return pix, nil } // 按尺寸去切图 func SubImg(i protomsg.Image, x0, y0, x1, y1 int) []byte { img, _ := gocv.NewMatFromBytes(int(i.Height), int(i.Width), gocv.MatTypeCV8UC3, i.Data) rect := image.Rect(EnlargeSize(x0, y0, x1, y1, i)) region := img.Region(rect) bytes, _ := gocv.IMEncode(".jpg", region) return bytes } // 长宽变为一比一,每边各扩百分之20 func EnlargeSize(x0, y0, x1, y1 int, i protomsg.Image) (x0_new, y0_new, x1_new, y1_new int) { // 先把长宽变为一比一 chazhi := (y1 - y0) - (x1 - x0) x0 = x0 - chazhi/2 if x0 < 0 { x0 = 0 } x1 = x1 + chazhi/2 if x1 > int(i.Width) { x1 = int(i.Width) } // 再把每边各扩大百分之20 enlarge := float32(0.2) x0_new = int((1+enlarge)*float32(x0) - enlarge*float32(x1)) if x0_new < 0 { x0_new = 0 } x1_new = int((1+enlarge)*float32(x1) - enlarge*float32(x0)) if x1_new > int(i.Width) { x1_new = int(i.Width) } y0_new = int((1+enlarge)*float32(y0) - enlarge*float32(y1)) if y0_new < 0 { y0_new = 0 } y1_new = int((1+enlarge)*float32(y1) - enlarge*float32(y0)) if y1_new > int(i.Height) { y1_new = int(i.Height) } return } func StringIpToInt(ipstring string) int { ipSegs := strings.Split(ipstring, ".") var ipInt int = 0 var pos uint = 24 for _, ipSeg := range ipSegs { tempInt, _ := strconv.Atoi(ipSeg) tempInt = tempInt << pos ipInt = ipInt | tempInt pos -= 8 } return ipInt } func IpIntToString(ipInt int) string { ipSegs := make([]string, 4) var len int = len(ipSegs) buffer := bytes.NewBufferString("") for i := 0; i < len; i++ { tempInt := ipInt & 0xFF ipSegs[len-i-1] = strconv.Itoa(tempInt) ipInt = ipInt >> 8 } for i := 0; i < len; i++ { buffer.WriteString(ipSegs[i]) if i < len-1 { buffer.WriteString(".") } } return buffer.String() } func ParseScore(compareScore float32) float32 { if compareScore < 1 { compareScore = compareScore * 100 } f, _ := strconv.ParseFloat(fmt.Sprintf("%2.2f", compareScore), 32) return float32(f) } func ParseScore64(compareScore float64) float64 { if compareScore < 1 { compareScore = compareScore * 100 } f, _ := strconv.ParseFloat(fmt.Sprintf("%2.2f", compareScore), 64) return f } // UnCompress uncompress func UnCompress(in []byte) ([]byte, error) { out := make([]byte, 10*len(in)) n, err := lz4.UncompressBlock(in, out) if err != nil { fmt.Println(err) return nil, err } out = out[:n] // uncompressed data return out, nil } // Compress compress func Compress(in []byte) ([]byte, error) { out := make([]byte, len(in)) ht := make([]int, 64<<10) // buffer for the compression table n, err := lz4.CompressBlock(in, out, ht) if err != nil { fmt.Println(err) return nil, err } if n >= len(in) { fmt.Println("image is not compressible") } out = out[:n] // compressed data return out, nil } // 判断所给路径文件/文件夹是否存在 func Exists(path string) bool { if path == "" { return false } _, err := os.Stat(path) //os.Stat获取文件信息 if err != nil { if os.IsExist(err) { return true } return false } return true } func CreateDirectory(path string) bool { if path == "" { return false } if Exists(path) { return true } err := os.MkdirAll(path,os.ModePerm) if err !=nil { return false } return true } //日期转字符串 func FormatDate(date time.Time, layout string) string { layout = strings.Replace(layout, "yyyy", "2006", 1) layout = strings.Replace(layout, "yy", "06", 1) layout = strings.Replace(layout, "MM", "01", 1) layout = strings.Replace(layout, "dd", "02", 1) layout = strings.Replace(layout, "HH", "15", 1) layout = strings.Replace(layout, "mm", "04", 1) layout = strings.Replace(layout, "ss", "05", 1) layout = strings.Replace(layout, "SSS", "000", -1) return date.Format(layout) } func ZipCheck(zipPath string) bool { f, err := os.Open(zipPath) if err != nil { return false } defer f.Close() buf := make([]byte, 4) if n, err := f.Read(buf); err != nil || n < 4 { return false } return bytes.Equal(buf, []byte("PK\x03\x04")) } func UnZip(archive, target string) error { reader, err := zip.OpenReader(archive) if err != nil { return err } if err := os.MkdirAll(target, 0755); err != nil { return err } for _, file := range reader.File { path := filepath.Join(target, file.Name) if file.FileInfo().IsDir() { os.MkdirAll(path, file.Mode()) continue } fileReader, err := file.Open() if err != nil { return err } defer fileReader.Close() targetFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode()) if err != nil { return err } defer targetFile.Close() if _, err := io.Copy(targetFile, fileReader); err != nil { return err } } return nil } func FormatNum(oNum int,n int) string { m := 0 for { oNum = oNum / 10 m++ if oNum == 0 { break } } fmtStr := "%0"+strconv.Itoa(m)+"d" return fmt.Sprintf(fmtStr, n) } func FileMd5(path string) (string,error){ file, err := os.Open(path) if err !=nil { return "",err } defer file.Close() _md5 := md5.New() if _,err := io.Copy(_md5, file);err != nil { return "",err } return hex.EncodeToString(_md5.Sum(nil)),nil }