diff --git a/fss/core/sendzip.go b/fss/core/sendzip.go index 31e7a56..8219891 100644 --- a/fss/core/sendzip.go +++ b/fss/core/sendzip.go @@ -16,7 +16,7 @@ func SendZip(w http.ResponseWriter, r *http.Request) { r.ParseForm() // 选择文件,并生成zip包 // 文件 - zipfarr := r.Form["zipfiles"] + zipfarr := r.Form["sfiles"] // 服务器ip地址 serip := r.Form["serverip"] @@ -50,7 +50,7 @@ func SendZip(w http.ResponseWriter, r *http.Request) { // 当前运行的目录 // ZIP 文件的实际路径 - ziprl := path.Join("./files/", zpFileName) + ziprl := path.Join("./sync_zips/", zpFileName) // zip 创建成功后 rest := <-taskId @@ -64,7 +64,7 @@ func SendZip(w http.ResponseWriter, r *http.Request) { fmt.Println("archive is not exist!!!") } // 执行完 跳转到 首页 - http.Redirect(w, r, "/console", http.StatusFound) + http.Redirect(w, r, "/", http.StatusFound) } // udp 模式发送文件 diff --git a/fss/fsw/index.html b/fss/fsw/index.html index 4fb37ea..0edd09f 100644 --- a/fss/fsw/index.html +++ b/fss/fsw/index.html @@ -304,6 +304,8 @@ html += ""; }) // append to html + html += ""; + html += ""; // $("#tgsc").html(html) $(elemnt).html(html); writelog(scip + "获取数据:" + res.data.list.length + "条数据") diff --git a/fss/util/fsutil.go b/fss/util/fsutil.go index 1e42b3b..73aaf6f 100644 --- a/fss/util/fsutil.go +++ b/fss/util/fsutil.go @@ -305,3 +305,87 @@ func DecompressZip(zpFname string) error { } return nil } + +// dest:目的地址以及压缩文件名 eg:/data/logZip/2022-12-12-log.zip +// paths:需要压缩的所有文件所组成的集合 +func CompressToZip(dest string, currentPath string, paths []string) error { + // fmt.Println("real path", currentPath) + // 打开files 目录 + filesPath := "" + if dir, err := os.Getwd(); err == nil { + filesPath = dir + "/files/" + } + if err := os.MkdirAll(filesPath, 0755); err != nil { + fmt.Println(err.Error()) + } + // ToSlash 过滤windows的斜杠引起的bug + zfile, err := os.Create(path.Join("./files", "/", dest)) + if err != nil { + return err + } + defer zfile.Close() + zipWriter := zip.NewWriter(zfile) + defer zipWriter.Close() + + // 遍历带压缩的目录信息 + for _, src := range paths { + // 替换文件名,并且去除前后 "\" 或 "/" + // path = strings.Trim(path, string(filepath.Separator)) + // 从配置中读取到源目录 + src = path.Join(currentPath, "/", src) + // 删除尾随路径(如果它是目录) + src := strings.TrimSuffix(src, string(os.PathSeparator)) + // 文件遍历 + err = filepath.Walk(src, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + // 创建本地文件头 + header, err := zip.FileInfoHeader(info) + if err != nil { + return err + } + + // 监听的工作目录作为文件的结尾,然后取相对路径 + // 在zip存档中设置文件的相对路径 + header.Name, err = filepath.Rel(filepath.Dir(config.G.FilePath), path) + if err != nil { + return err + } + + // 转换为Unix风格的路径分隔符 + header.Name = filepath.ToSlash(header.Name) + + // 目录需要拼上一个 "/" ,否则会出现一个和目录一样的文件在压缩包中 + if info.IsDir() { + header.Name += "/" + } else { + // 将压缩方法设置为deflate + header.Method = zip.Deflate + } + // fmt.Printf("zip header:%v\n", header.Name) + // 创建写入头的writer + headerWriter, err := zipWriter.CreateHeader(header) + if err != nil { + return err + } + if info.IsDir() { + return nil + } + f, err := os.Open(path) + if err != nil { + return err + } + defer f.Close() + _, err = io.Copy(headerWriter, f) + return err + }) + + if err != nil { + return err + } + } + // 存到指定位置 + os.Rename(dest, path.Join("./sync_zips/", dest)) + return nil +}