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 } }