diff --git a/godo/go.mod b/godo/go.mod index 75cbf11..96f5a2b 100644 --- a/godo/go.mod +++ b/godo/go.mod @@ -8,7 +8,6 @@ require ( github.com/gorilla/mux v1.8.1 github.com/minio/selfupdate v0.6.0 github.com/shirou/gopsutil v3.21.11+incompatible - golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 ) require ( diff --git a/godo/go.sum b/godo/go.sum index 11d6708..be86de1 100644 --- a/godo/go.sum +++ b/godo/go.sum @@ -29,7 +29,6 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijukjXBlj7Es2QQplab+/RbQ4= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/godo/localchat/file.go b/godo/localchat/file.go index f7cb07c..6b8a41f 100644 --- a/godo/localchat/file.go +++ b/godo/localchat/file.go @@ -148,8 +148,10 @@ func handleFile(filePath string, toIp string, message UdpMessage) { fileSize := fileInfo.Size() // 计算需要发送的数据包数量 - numChunks := (fileSize + GlobalfileSize - 1) / GlobalfileSize - + numChunks := fileSize / GlobalfileSize + if fileSize%GlobalfileSize != 0 { + numChunks++ + } // 发送文件 SendFile(file, int(numChunks), toIp, fileSize, message) } diff --git a/godo/localchat/image.go b/godo/localchat/image.go index 039890a..3d3e32c 100644 --- a/godo/localchat/image.go +++ b/godo/localchat/image.go @@ -26,6 +26,7 @@ package localchat import ( "encoding/json" + "fmt" "godo/libs" "io" "log" @@ -33,6 +34,8 @@ import ( "net/url" "os" "path/filepath" + "strconv" + "strings" "time" ) @@ -52,7 +55,6 @@ func HandlerSendImg(w http.ResponseWriter, r *http.Request) { msg.Hostname = hostname msg.Time = time.Now() msg.Type = "image" - toIp := msg.IP basePath, err := libs.GetOsDir() if err != nil { log.Printf("GetOsDir error: %v", err) @@ -66,7 +68,7 @@ func HandlerSendImg(w http.ResponseWriter, r *http.Request) { libs.ErrorMsg(w, "HandleMessage message error") return } - + sendPath := []string{} for _, v := range paths { p, ok := v.(string) if !ok { @@ -76,74 +78,111 @@ func HandlerSendImg(w http.ResponseWriter, r *http.Request) { // 处理多张图片 if fileInfo, err := os.Stat(filePath); err == nil { if !fileInfo.IsDir() { - handleFile(filePath, toIp, msg) + //handleFile(filePath, toIp, msg) + sendPath = append(sendPath, p) } } else { continue } } + msg.Message = sendPath + SendToIP(msg) libs.SuccessMsg(w, nil, "图片发送成功") } -// func ReceiveImg(msg UdpMessage) (string, error) { -// chunk := msg.Message.(FileChunk) - -// // 验证校验和 -// calculatedChecksum := calculateChecksum(chunk.Data) -// if calculatedChecksum != chunk.Checksum { -// fmt.Printf("Checksum mismatch for image from %s\n", msg.IP) -// return "", fmt.Errorf("checksum mismatch") -// } - -// baseDir, err := libs.GetOsDir() -// if err != nil { -// log.Printf("Failed to get OS directory: %v", err) -// return "", err -// } - -// // 创建接收文件的目录 -// resPath := filepath.Join("C", "Users", "Reciv", time.Now().Format("2006-01-02")) -// receiveDir := filepath.Join(baseDir, resPath) -// if !libs.PathExists(receiveDir) { -// err := os.MkdirAll(receiveDir, 0755) -// if err != nil { -// log.Printf("Failed to create receive directory: %v", err) -// return "", err -// } -// } - -// // 确定文件路径 -// filePath := filepath.Join(receiveDir, chunk.Filename) - -// // 如果文件不存在,则创建新文件 -// if _, err := os.Stat(filePath); os.IsNotExist(err) { -// file, err := os.Create(filePath) -// if err != nil { -// log.Printf("Failed to create file: %v", err) -// return "", err -// } -// defer file.Close() -// } - -// // 打开或追加到现有文件 -// file, err := os.OpenFile(filePath, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644) -// if err != nil { -// log.Printf("Failed to open file: %v", err) -// return "", err -// } -// defer file.Close() - -// // 写入数据 -// _, err = file.Write(chunk.Data) -// if err != nil { -// log.Printf("Failed to write data to file: %v", err) -// return "", err -// } - -// fmt.Printf("接收到图片 %s 从 %s 成功\n", filePath, msg.IP) -// resFilePath := filepath.Join(resPath, chunk.Filename) -// return resFilePath, nil -// } +func ReceiveImg(msg UdpMessage) ([]string, error) { + res := []string{} + baseDir, err := libs.GetOsDir() + if err != nil { + log.Printf("Failed to get OS directory: %v", err) + return res, err + } + + // 创建接收文件的目录 + resPath := filepath.Join("C", "Users", "Reciv", time.Now().Format("2006-01-02")) + receiveDir := filepath.Join(baseDir, resPath) + if !libs.PathExists(receiveDir) { + err := os.MkdirAll(receiveDir, 0755) + if err != nil { + log.Printf("Failed to create receive directory: %v", err) + return res, err + } + } + paths, ok := msg.Message.([]interface{}) + //log.Printf("paths: %v", paths) + if !ok { + return res, fmt.Errorf("HandleMessage message error") + } + var savedPaths []string + for _, v := range paths { + p, ok := v.(string) + if !ok { + continue + } + imgUrl := fmt.Sprintf("http://%s/viewimg?img=%s", msg.IP, url.QueryEscape(p)) + resp, err := http.Get(imgUrl) + if err != nil { + log.Printf("Failed to download image from URL %s: %v", imgUrl, err) + continue + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + log.Printf("Failed to download image from URL %s: %v", imgUrl, resp.Status) + continue + } + // 生成随机文件名 + // 生成随机文件名并保留扩展名 + fileName, err := generateRandomFileNameWithExtension(p) + if err != nil { + log.Printf("Failed to generate random file name: %v", err) + continue + } + filePath := filepath.Join(receiveDir, fileName) + // 保存图片 + err = saveImage(resp.Body, filePath) + if err != nil { + log.Printf("Failed to save image to %s: %v", filePath, err) + continue + } + savedPaths = append(savedPaths, filePath) + + } + if len(savedPaths) > 0 { + return savedPaths, nil + } + + return res, fmt.Errorf("no images were saved") + +} + +// 生成随机文件名并保留扩展名 +func generateRandomFileNameWithExtension(originalFileName string) (string, error) { + fileNameWithoutExt, fileExt := filepath.Split(originalFileName) + fileExt = strings.TrimPrefix(fileExt, ".") + if fileExt == "" { + fileExt = "png" + } + + randomFileName := fmt.Sprintf("%s_%s.%s", fileNameWithoutExt, strconv.FormatInt(time.Now().UnixNano(), 10), fileExt) + return randomFileName, nil +} + +// 保存图片到本地文件 +func saveImage(reader io.Reader, filePath string) error { + file, err := os.Create(filePath) + if err != nil { + return fmt.Errorf("failed to create file: %v", err) + } + defer file.Close() + + _, err = io.Copy(file, reader) + if err != nil { + return fmt.Errorf("failed to write image data to file: %v", err) + } + + return nil +} func HandleViewImg(w http.ResponseWriter, r *http.Request) { img := r.URL.Query().Get("img") if img == "" { diff --git a/godo/localchat/server.go b/godo/localchat/server.go index bdb9e4d..3c24abd 100644 --- a/godo/localchat/server.go +++ b/godo/localchat/server.go @@ -28,7 +28,6 @@ import ( "godo/libs" "log" "net" - "strings" "time" ) @@ -100,24 +99,6 @@ func UdpServer() { continue } ip := udpAddr.IP.String() - - parts := strings.Split(string(buffer[:n]), "@") // 假设标识符不会超过256字节 - if len(parts) >= 5 { - filename, err := ReceiveFiles(parts) - if err != nil { - log.Printf("error receiving file: %v", err) - continue - } - msg := UdpMessage{ - Hostname: parts[1], - Type: parts[0], - Time: time.Now(), - IP: ip, - Message: filename, - } - AddMessage(msg) - continue - } // 解析 UDP 数据 var udpMsg UdpMessage err = json.Unmarshal(buffer[:n], &udpMsg) @@ -140,14 +121,14 @@ func UdpServer() { HandlerSendFile(udpMsg) continue } - // if udpMsg.Type == "image" { - // filePath, err := ReceiveFile(udpMsg) - // if err != nil { - // log.Printf("error receiving image: %v", err) - // continue - // } - // udpMsg.Message = filePath - // } + if udpMsg.Type == "image" { + filePath, err := ReceiveImg(udpMsg) + if err != nil { + log.Printf("error receiving image: %v", err) + continue + } + udpMsg.Message = filePath + } // 添加消息到 UserMessages AddMessage(udpMsg)