From e1a60b6255da756308cf68cc4640868cdda428c5 Mon Sep 17 00:00:00 2001
From: 554325746@qq.com <554325746@qq.com>
Date: 星期六, 29 六月 2019 11:24:48 +0800
Subject: [PATCH] add updatesnopshotUrl

---
 controllers/camera.go         |   21 +++++++
 service/CamraUpdatesnashot.go |  145 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 166 insertions(+), 0 deletions(-)

diff --git a/controllers/camera.go b/controllers/camera.go
index 9cf2351..20ec0c6 100644
--- a/controllers/camera.go
+++ b/controllers/camera.go
@@ -10,6 +10,7 @@
 	"basic.com/dbapi.git"
 	"webserver/extend/code"
 	"webserver/extend/util"
+    "webserver/service"
 )
 
 type CameraController struct{}
@@ -254,6 +255,24 @@
 	}
 }
 
+// @Summary  鏇存柊搴曞浘
+// @Description 鍒锋柊搴曞浘
+// @Produce json
+// @Tags camera
+// @Param cid path string true "鎽勫儚鏈篿d"
+// @Success 200 {string} json "{"code":200, success:true,  msg:"", data:"杩斿洖鐨勬枃浠舵湇鍔″櫒鍦板潃"}"
+// @Failure 500 {string} json "{"code":500, success:false   msg:"",data:"閿欒淇℃伅鍐呭"}"
+// @Router /data/api-v/camera/updateSnapshotUrl/{cid} [get]
+func(cc CameraController) UpdateSnapshotUrl(c *gin.Context){
+    cid := c.Param("cid")
+    filename, err := service.UpdateSnapshotUrl(cid)
+    if err != nil {
+		util.ResponseFormat(c, code.ComError, "鏇存柊澶辫触")
+        return 
+    }
+    util.ResponseFormat(c, code.Success, filename)
+} 
+
 type CameraChangeRunVo struct {
 	CameraIds []string `json:"camera_ids"`
 	RunType   int      `json:"run_type"`
@@ -282,3 +301,5 @@
 		util.ResponseFormat(c, code.ComError, "鏇存柊澶辫触")
 	}
 }
+
+
diff --git a/service/CamraUpdatesnashot.go b/service/CamraUpdatesnashot.go
new file mode 100644
index 0000000..60f2eb7
--- /dev/null
+++ b/service/CamraUpdatesnashot.go
@@ -0,0 +1,145 @@
+package service
+
+import (
+        "fmt"
+        "time"
+        "flag"
+        "os/exec"
+
+        "bytes"
+        "encoding/json"
+        "errors"
+        "io"
+        "log"
+        "mime/multipart"
+        "net/http"
+        "gocv.io/x/gocv"
+        "path/filepath"
+
+        "basic.com/dbapi.git"
+   )
+
+
+func PostFormBufferData(uri string, filepath string, fileName string) (maps map[string]interface{}, err0 error) {
+          // 瑕佹寚瀹氳浆byte鐨勬牸寮�
+            picMat := gocv.IMRead(filepath, gocv.IMReadColor)
+            defer picMat.Close()
+            if picMat.Empty() {
+                     return nil, errors.New("file not exist")
+            }
+
+            pheight := picMat.Rows()
+            pwidth := picMat.Cols()
+            pdata := picMat.ToBytes()
+
+          imgs := gocv.NewMat()
+          imgs, _ = gocv.NewMatFromBytes(pheight, pwidth, gocv.MatTypeCV8UC3, pdata)
+          fdata,_ := gocv.IMEncode(".jpg",imgs)
+          body := &bytes.Buffer{}
+          writer := multipart.NewWriter(body)
+            _, err := writer.CreateFormFile("file", fileName)
+            if err != nil {
+                return nil, err
+            }
+           boundary := writer.Boundary()
+              //close_string := fmt.Sprintf("\r\n--%s--\r\n", boundary)
+              close_buf := bytes.NewBufferString(fmt.Sprintf("\r\n--%s--\r\n", boundary))
+              file := bytes.NewBuffer(fdata)
+              request_reader := io.MultiReader(body, file, close_buf)
+              //_, err = io.Copy(part, file)
+              //writer.WriteField(key, val)
+              request, err := http.NewRequest("POST", uri, request_reader)
+              request.Header.Add("Content-Type", writer.FormDataContentType())
+              timeout := time.Duration(5 * time.Second) //瓒呮椂鏃堕棿50ms
+              client := &http.Client{Timeout: timeout}
+          resp, err := client.Do(request)
+              if err != nil {
+                  log.Fatal(err)
+                      return nil, err
+              }
+          defer func() {
+              if r := recover(); r != nil {
+                  fmt.Printf("panic鐨勫唴瀹�%v\n", r)
+                      msg := "涓婁紶鍥剧墖鏈嶅姟鍣ㄥ紓甯�"
+                      if _, ok := r.(error); ok {
+                          msg = r.(error).Error()
+                              fmt.Println("panic--recover()寰楀埌鐨勬槸error绫诲瀷")
+                      }
+                  if _, ok := r.(string); ok {
+                      msg = r.(string)
+                          fmt.Println("panic--recover()寰楀埌鐨勬槸string绫诲瀷")
+                  }
+                  err0 = errors.New(msg)
+              }
+          }()
+          defer resp.Body.Close()
+          {
+     body := &bytes.Buffer{}
+      _, err := body.ReadFrom(resp.Body)
+          if err != nil {
+              log.Fatal(err)
+          }
+      fmt.Println(resp.StatusCode)
+          //fmt.Println(resp.Header)
+          fmt.Println(body)
+          //decoder := json.NewDecoder(strings.NewReader(body.String()))
+          decoder := make(map[string]interface{})
+          if err := json.Unmarshal([]byte(body.String()), &decoder); err != nil {
+              return nil, err
+          }
+      return decoder, nil
+          }
+}
+
+
+
+func processphoto(cid string) (local string, err error) {
+    var camApi dbapi.CameraApi
+    caminfo, err := camApi.GetCameraById(cid)
+    _ = caminfo
+    if err != nil {
+       return  "", err
+    }
+
+    _, err = exec.LookPath("ffmpeg")
+    if err != nil {
+        return "", nil 
+    }
+
+    piclocal := fmt.Sprintf("%s%s.jpg",*storelocal,time.Now().String())
+    cmd := exec.Command("ffmpeg", "-i",caminfo.Rtsp, "-y", "-f", "image2","-t", "0.001","-vf","select='eq(pict_type\\,I)',setpts='N/(25*TB)'", "-s","1920*1080", piclocal)
+
+    err = cmd.Run()
+    if err != nil {
+        return "",  err 
+    }
+    return piclocal, nil 
+}
+
+var storelocal = flag.String("storelcoal","/home/user/workspace/gitblit/", "address of picture produce.") 
+var fileurl    = flag.String("fileurl","http://192.168.1.182:6333/submit", "url of file server.")
+
+func UpdateSnapshotUrl(cid string)(filename string, err error) {
+    var camApi dbapi.CameraApi
+
+    flag.Parse()
+
+     piclocal, err := processphoto(cid)
+     if err != nil {
+        return "", err 
+     }
+
+    resp, err := PostFormBufferData(*fileurl, piclocal, piclocal )
+    if err != nil {
+        fmt.Println(err)
+        return "", err
+    }
+
+    fileurl := resp["fileUrl"].(string)
+    filename = filepath.Base(fileurl)
+    ok := camApi.UpdateSnapshotUrl(cid, filename))
+    if !ok {
+        return "",errors.New("update filelocal to camera fail") 
+    }
+    return filename, nil
+}

--
Gitblit v1.8.0