LingxinMeng 10 miesięcy temu
rodzic
commit
7700e056d6

+ 14 - 2
aarch64/pjibot_guide/common/service/rosbag_upload.go

@@ -143,15 +143,27 @@ outLoop:
 		commonConfig.OssMutex.Lock()
 		// 上传callback.json
 		err = commonConfig.OssBucket.PutObject(objectKey3+"callback.json", strings.NewReader(callBackJson))
+		if err != nil {
+			c_log.GlobalLogger.Error("上传 callback.json 文件失败:", err)
+		}
 		// 额外采集mapBuf
 		for _, file := range commonConfig.CloudConfig.MapBufFiles {
 			err = commonConfig.OssBucket.PutObjectFromFile(objectKey3+filepath.Base(file), file)
+			if err != nil {
+				c_log.GlobalLogger.Error("上传 mapBuf 文件失败:", err)
+			}
 		}
+
 		// 额外采集data目录
-		commonConfig.OssMutex.Unlock()
+		err = util.ZipDir(commonConfig.CloudConfig.DataDir.Src, commonConfig.CloudConfig.DataDir.Dest, commonConfig.CloudConfig.DataDir.Exclude)
+		if err != nil {
+			c_log.GlobalLogger.Error("压缩data目录失败:", err)
+		}
+		err = commonConfig.OssBucket.PutObjectFromFile(objectKey3+"data.zip", commonConfig.CloudConfig.DataDir.Dest)
 		if err != nil {
-			c_log.GlobalLogger.Error("上传 callback.json 或 mapBuf 文件失败:", err)
+			c_log.GlobalLogger.Error("上传 data 目录压缩文件失败:", err)
 		}
+		commonConfig.OssMutex.Unlock()
 
 		// 删除本地所有已上传的bag文件
 		c_log.GlobalLogger.Infof("结束处理窗口,【Lable】=%v,【FaultTime】=%v,【Length】=%v", currentTimeWindow.Labels, currentTimeWindow.FaultTime, currentTimeWindow.Length)

+ 62 - 0
common/util/u_io.go

@@ -1,6 +1,7 @@
 package util
 
 import (
+	"archive/zip"
 	"fmt"
 	"io"
 	"io/fs"
@@ -10,6 +11,67 @@ import (
 	"strings"
 )
 
+// 压缩指定目录到ZIP文件,并排除一个指定的子目录
+func ZipDir(src, dest, excludeDir string) error {
+	zipf, err := os.Create(dest)
+	if err != nil {
+		return err
+	}
+	defer zipf.Close()
+
+	archive := zip.NewWriter(zipf)
+	defer archive.Close()
+
+	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
+		}
+
+		// 修正文件路径,使其相对于src
+		header.Name, err = filepath.Rel(src, path)
+		if err != nil {
+			return err
+		}
+
+		// 如果路径包含要排除的目录,则跳过
+		if strings.Contains(header.Name, excludeDir) {
+			if info.IsDir() {
+				return filepath.SkipDir // 如果是目录,则跳过整个目录
+			}
+			return nil // 如果是文件,则忽略该文件
+		}
+
+		if info.IsDir() {
+			header.Name += "/"
+		} else {
+			header.Method = zip.Deflate
+		}
+
+		writer, err := archive.CreateHeader(header)
+		if err != nil {
+			return err
+		}
+
+		if !info.IsDir() {
+			file, err := os.Open(path)
+			if err != nil {
+				return err
+			}
+			defer file.Close()
+			_, err = io.Copy(writer, file)
+			return err
+		}
+		return nil
+	})
+
+	return nil
+}
+
 func GetFileSize(filePath string) (int, error) {
 	fileInfo, err := os.Stat(filePath)
 	if err != nil {