From 8648844a85f9769d3fc9845df82ee1faf9c8f7a1 Mon Sep 17 00:00:00 2001 From: godo Date: Tue, 10 Sep 2024 15:11:33 +0800 Subject: [PATCH] change --- godo/localchat/{file.go => filedown.go} | 143 +++++++----------------- godo/localchat/filemsg.go | 72 ++++++++++++ 2 files changed, 111 insertions(+), 104 deletions(-) rename godo/localchat/{file.go => filedown.go} (55%) create mode 100644 godo/localchat/filemsg.go diff --git a/godo/localchat/file.go b/godo/localchat/filedown.go similarity index 55% rename from godo/localchat/file.go rename to godo/localchat/filedown.go index c47e8c6..2c554e3 100644 --- a/godo/localchat/file.go +++ b/godo/localchat/filedown.go @@ -36,69 +36,6 @@ import ( "time" ) -func HandlerApplySendFile(w http.ResponseWriter, r *http.Request) { - var msg UdpMessage - decoder := json.NewDecoder(r.Body) - if err := decoder.Decode(&msg); err != nil { - http.Error(w, "Invalid request body", http.StatusBadRequest) - return - } - defer r.Body.Close() - hostname, err := os.Hostname() - if err != nil { - libs.ErrorMsg(w, "HandleMessage error") - return - } - msg.Hostname = hostname - msg.Time = time.Now() - msg.Type = "fileSending" - SendToIP(msg) - libs.SuccessMsg(w, nil, "请求文件发送成功") -} -func HandlerCannelFile(w http.ResponseWriter, r *http.Request) { - var msg UdpMessage - decoder := json.NewDecoder(r.Body) - if err := decoder.Decode(&msg); err != nil { - http.Error(w, "Invalid request body", http.StatusBadRequest) - return - } - defer r.Body.Close() - hostname, err := os.Hostname() - if err != nil { - libs.ErrorMsg(w, "HandleMessage error") - return - } - msg.Hostname = hostname - msg.Time = time.Now() - msg.Type = "fileCannel" - SendToIP(msg) - libs.SuccessMsg(w, nil, "请求文件发送成功") -} -func HandlerAccessFile(w http.ResponseWriter, r *http.Request) { - var msg UdpMessage - decoder := json.NewDecoder(r.Body) - if err := decoder.Decode(&msg); err != nil { - http.Error(w, "Invalid request body", http.StatusBadRequest) - return - } - defer r.Body.Close() - hostname, err := os.Hostname() - if err != nil { - libs.ErrorMsg(w, "HandleMessage error") - return - } - msg.Hostname = hostname - msg.Time = time.Now() - msg.Type = "fileAccessed" - SendToIP(msg) - err = downloadFiles(msg) - if err != nil { - libs.ErrorMsg(w, "HandleMessage error") - return - } - libs.SuccessMsg(w, msg.Message, "接收文件中") -} - func downloadFiles(msg UdpMessage) error { postUrl := fmt.Sprintf("http://%s:56780/localchat/getfiles", msg.IP) postData, err := json.Marshal(msg.Message) @@ -133,31 +70,30 @@ func downloadFiles(msg UdpMessage) error { } } - err = saveFiles(resp.Body, receiveDir) - if err != nil { - return fmt.Errorf("failed to save files: %v", err) + // 处理响应中的文件 + if err := handleResponse(resp.Body, receiveDir); err != nil { + log.Fatalf("Failed to handle response: %v", err) } fmt.Println("Files downloaded successfully") return nil } -func saveFiles(reader io.Reader, saveDir string) error { +func handleResponse(reader io.Reader, saveDir string) error { body, err := io.ReadAll(reader) if err != nil { return fmt.Errorf("failed to read response body: %v", err) } var fileList FileList - err = json.Unmarshal(body, &fileList) - if err != nil { + if err := json.Unmarshal(body, &fileList); err != nil { return fmt.Errorf("failed to unmarshal file list: %v", err) } for _, filePath := range fileList.Files { err := saveFileOrFolder(filePath, saveDir) if err != nil { - return fmt.Errorf("failed to serve file or folder: %v", err) + return fmt.Errorf("failed to save file or folder: %v", err) } } @@ -165,47 +101,56 @@ func saveFiles(reader io.Reader, saveDir string) error { } func saveFileOrFolder(filePath string, saveDir string) error { - file, err := os.Open(filePath) - if err != nil { - return fmt.Errorf("failed to open file or folder: %v", err) - } - defer file.Close() + relativePath := filePath + localFilePath := filepath.Join(saveDir, relativePath) - fileInfo, err := file.Stat() - if err != nil { - return fmt.Errorf("failed to stat file or folder: %v", err) - } - - if fileInfo.IsDir() { - return saveFolder(fileInfo.Name(), filePath, saveDir) + // 检查是否为文件夹 + if _, err := os.Stat(localFilePath); os.IsNotExist(err) { + // 如果不存在,则创建文件夹 + err := os.MkdirAll(localFilePath, 0755) + if err != nil { + return fmt.Errorf("failed to create directory: %v", err) + } + } else if fileInfo, err := os.Stat(localFilePath); err == nil && fileInfo.IsDir() { + // 如果是文件夹,则递归处理 + err := saveFolder(relativePath, saveDir) + if err != nil { + return fmt.Errorf("failed to save folder: %v", err) + } + } else { + // 如果是文件,则直接保存 + err := saveFile(localFilePath) + if err != nil { + return fmt.Errorf("failed to save file: %v", err) + } } - return saveFile(filePath, saveDir) + return nil } -func saveFolder(folderName string, folderPath string, saveDir string) error { +func saveFolder(folderName string, saveDir string) error { localFolderPath := filepath.Join(saveDir, folderName) err := os.MkdirAll(localFolderPath, 0755) if err != nil { return fmt.Errorf("failed to create directory: %v", err) } + // 获取文件夹内容 + folderPath := filepath.Join(saveDir, folderName) files, err := os.ReadDir(folderPath) if err != nil { return fmt.Errorf("failed to read directory: %v", err) } for _, file := range files { - subPath := filepath.Join(folderPath, file.Name()) - subSavePath := filepath.Join(localFolderPath, file.Name()) - + subPath := filepath.Join(folderName, file.Name()) if file.IsDir() { - err := saveFolder(file.Name(), subPath, localFolderPath) + err := saveFolder(subPath, localFolderPath) if err != nil { return fmt.Errorf("failed to save folder: %v", err) } } else { - err := saveFile(subPath, subSavePath) + err := saveFile(filepath.Join(localFolderPath, file.Name())) if err != nil { return fmt.Errorf("failed to save file: %v", err) } @@ -215,31 +160,21 @@ func saveFolder(folderName string, folderPath string, saveDir string) error { return nil } -func saveFile(filePath string, saveDir string) error { +func saveFile(filePath string) error { file, err := os.Open(filePath) if err != nil { return fmt.Errorf("failed to open file: %v", err) } defer file.Close() - fileInfo, err := file.Stat() - if err != nil { - return fmt.Errorf("failed to stat file: %v", err) - } - - localFilePath := filepath.Join(saveDir, fileInfo.Name()) - err = os.MkdirAll(filepath.Dir(localFilePath), 0755) - if err != nil { - return fmt.Errorf("failed to create directory: %v", err) - } - - out, err := os.Create(localFilePath) + // 创建本地文件 + localFile, err := os.Create(filePath) if err != nil { return fmt.Errorf("failed to create file: %v", err) } - defer out.Close() + defer localFile.Close() - _, err = io.Copy(out, file) + _, err = io.Copy(localFile, file) if err != nil { return fmt.Errorf("failed to copy file: %v", err) } diff --git a/godo/localchat/filemsg.go b/godo/localchat/filemsg.go new file mode 100644 index 0000000..efb0312 --- /dev/null +++ b/godo/localchat/filemsg.go @@ -0,0 +1,72 @@ +package localchat + +import ( + "encoding/json" + "godo/libs" + "net/http" + "os" + "time" +) + +func HandlerApplySendFile(w http.ResponseWriter, r *http.Request) { + var msg UdpMessage + decoder := json.NewDecoder(r.Body) + if err := decoder.Decode(&msg); err != nil { + http.Error(w, "Invalid request body", http.StatusBadRequest) + return + } + defer r.Body.Close() + hostname, err := os.Hostname() + if err != nil { + libs.ErrorMsg(w, "HandleMessage error") + return + } + msg.Hostname = hostname + msg.Time = time.Now() + msg.Type = "fileSending" + SendToIP(msg) + libs.SuccessMsg(w, nil, "请求文件发送成功") +} +func HandlerCannelFile(w http.ResponseWriter, r *http.Request) { + var msg UdpMessage + decoder := json.NewDecoder(r.Body) + if err := decoder.Decode(&msg); err != nil { + http.Error(w, "Invalid request body", http.StatusBadRequest) + return + } + defer r.Body.Close() + hostname, err := os.Hostname() + if err != nil { + libs.ErrorMsg(w, "HandleMessage error") + return + } + msg.Hostname = hostname + msg.Time = time.Now() + msg.Type = "fileCannel" + SendToIP(msg) + libs.SuccessMsg(w, nil, "请求文件发送成功") +} +func HandlerAccessFile(w http.ResponseWriter, r *http.Request) { + var msg UdpMessage + decoder := json.NewDecoder(r.Body) + if err := decoder.Decode(&msg); err != nil { + http.Error(w, "Invalid request body", http.StatusBadRequest) + return + } + defer r.Body.Close() + hostname, err := os.Hostname() + if err != nil { + libs.ErrorMsg(w, "HandleMessage error") + return + } + msg.Hostname = hostname + msg.Time = time.Now() + msg.Type = "fileAccessed" + SendToIP(msg) + err = downloadFiles(msg) + if err != nil { + libs.ErrorMsg(w, "HandleMessage error") + return + } + libs.SuccessMsg(w, msg.Message, "接收文件中") +}