package core import ( "io" "os" "path/filepath" "scagent/util" "go.uber.org/zap" ) type UpFileService struct{} // FileInfo 包含文件的元信息 type FileInfo struct { FileName string FileSize int64 } // FileChunk 表示文件的一部分 type FileChunk struct { Data []byte FileName string DirPath string Offset int64 IsLast bool } // 发送文件的RPC // SendFile 接收文件信息(名称和大小) func (f *UpFileService) SendFileInfo(info FileInfo, reply *string) error { logger := util.NewProductionLogger() defer logger.Sync() // 创建保存文件的目录 // if err := os.MkdirAll("received_files", 0755); err != nil { // return err // } // 提取路径 /www/wwwroot/bidemo.com/BIU_20250918_183144.zip dirPath := filepath.Dir(info.FileName) logger.Info("SendFileInfo", zap.String("dirPath", dirPath)) // 检查文件夹是否存在 if _, err := os.Stat(dirPath); os.IsNotExist(err) { // 文件夹不存在,创建它 if err := os.MkdirAll(dirPath, 0755); err != nil { logger.Error("SendFileInfo mkdir failed", zap.Error(err)) } } // 返回true的字符串 *reply = "true" return nil } // SendFileChunk 接收文件块并写入文件 func (f *UpFileService) SendFileChunk(chunk FileChunk, reply *bool) error { // 日志 logger := util.NewProductionLogger() defer logger.Sync() // filePath := filepath.Join("/www/afs/logs/00", chunk.FileName) // fmt.Printf("recive file :%s", chunk.FileName) // 合并为实际路径 filePath := filepath.Join(chunk.DirPath, chunk.FileName) // filePath := chunk.FileName // 打开文件,使用追加模式 file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0644) if err != nil { logger.Error("SendFileChunk OpenFile failed", zap.Error(err)) } defer file.Close() // 移动到指定偏移量 if _, err := file.Seek(chunk.Offset, io.SeekStart); err != nil { logger.Error("SendFileChunk Seek failed", zap.Error(err)) } // 写入数据 if _, err := file.Write(chunk.Data); err != nil { logger.Error("SendFileChunk Write failed", zap.Error(err)) } *reply = true return nil } // 解压缩文件 // info.FileName 压缩包全路径 func (f *UpFileService) UnzipArchive(info FileInfo, reply *string) error { // 日志 logger := util.NewProductionLogger() defer logger.Sync() logger.Info("UnzipArchive", zap.String("filename", info.FileName)) // 解压缩文件 ret := make(chan string) go func() { util.DecompressZip(info.FileName) ret <- "uzok" }() // 返回true的字符串 if retMsg := <-ret; retMsg == "uzok" { *reply = retMsg } return nil }