Browse Source

change img

master
godo 9 months ago
parent
commit
9e117e5e20
  1. 1
      godo/go.mod
  2. 1
      godo/go.sum
  3. 6
      godo/localchat/file.go
  4. 163
      godo/localchat/image.go
  5. 35
      godo/localchat/server.go

1
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 (

1
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=

6
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)
}

163
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 == "" {

35
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)

Loading…
Cancel
Save