liuxiaolong
2019-11-13 f26a0cab5bca17b7eab57f6330e576271e17a17f
service/SdkDownLoad.go
@@ -1 +1,112 @@
package service
import (
   "bytes"
   "crypto/md5"
   "encoding/hex"
   "fmt"
   "io"
   "io/ioutil"
   "net/http"
   "os"
   "strings"
   "basic.com/valib/logger.git"
   "webserver/util"
)
// 从服务器上下载文件到临时目录,校验之后如果完整将其拷贝到目标目录下
func DownSo(url string)(bool,error) {
   resp, err := http.Get(url)
   if err != nil {
      logger.Error("获取文件失败")
      return false,err
   }
   // 从resp中读出zip文件解压缩,解出face.so,face.txt,然后把解压出的so用MD5编码出一个temp.txt文件,与解压出的so.txt文件比对,
   body, err := ioutil.ReadAll(resp.Body)
   if err != nil {
      logger.Error("读取resp.body失败")
      return false,err
   }
   CopyFile(body, "/opt/temp/temp.zip")
   util.DeCompress("/opt/temp/temp.zip", "/opt/temp")
   fileName := GetFileNameFromUrl(url,false)
   md5str,err1 := File2md5("/opt/temp/"+fileName+".so")
   if err1 != nil {
      logger.Error(err1)
      return false,err1
   }
   md5str_origin,err2 := ioutil.ReadFile("/opt/temp/"+fileName+".txt")
   if err2 != nil {
      logger.Error("读取解压后的md5文件失败")
      return false,err2
   }
   flag := CompareMd5([]byte(md5str),md5str_origin)
   if flag {
      logger.Info("两次MD5编码一致!")
   } else {
      logger.Debug("两次MD5编码不一致,请重新下载")
      return false,nil
   }
   // 从url中截取soName
   soName := GetFileNameFromUrl(url,true)
   f, err := os.Create("/opt/workspace/ruleprocess/algorithm/" + soName)
   if err != nil {
      logger.Error("在项目目录下创建so文件失败")
      return false,err
   }
   data,_ := ioutil.ReadFile("/opt/temp/"+soName)
   _,err4 := f.Write(data)
   if err4 != nil {
      logger.Error("复制文件出错")
      return false,err4
   }
   return true,nil
}
func CopyFile(byte []byte, dst string) (w int64, err error) {
   dstFile, err := os.Create(dst)
   if err != nil {
      fmt.Println(err.Error())
      return
   }
   defer dstFile.Close()
   return io.Copy(dstFile, bytes.NewReader(byte))
}
// 指定目录的文件生成相应的MD5码文件
func File2md5 (filename string) (string, error) {
   // 文件生成MD5加密加密文件
   file, err := os.Open(filename)
   if err != nil {
      fmt.Println("os Open error")
      return "", err
   }
   md5 := md5.New()
   _, err = io.Copy(md5, file)
   if err != nil {
      fmt.Println("io copy error")
      return "", err
   }
   md5Str := hex.EncodeToString(md5.Sum(nil))
   return md5Str,nil
}
// 从url中截取出文件名,参数是是否带后缀
func GetFileNameFromUrl(url string,withSuffix bool)string {
   fileName := strings.Split(url,"/")[len(strings.Split(url,"/"))-1]
   if withSuffix {
      return fileName
   } else {
      withoutSuffix := strings.Split(fileName,".")[0]
      return withoutSuffix
   }
}
// 比较两个MD5编码是否一致
func CompareMd5(value1 []byte,value2 []byte) bool{
   num := bytes.Compare(value1,value2)
   if num == 0 {
      return true
   } else {
      return false
   }
}