|
|
@ -26,11 +26,9 @@ package localchat |
|
|
|
|
|
|
|
import ( |
|
|
|
"encoding/json" |
|
|
|
"fmt" |
|
|
|
"godo/libs" |
|
|
|
"io" |
|
|
|
"log" |
|
|
|
"net" |
|
|
|
"net/http" |
|
|
|
"net/url" |
|
|
|
"os" |
|
|
@ -60,10 +58,10 @@ func HandlerSendImg(w http.ResponseWriter, r *http.Request) { |
|
|
|
log.Printf("GetOsDir error: %v", err) |
|
|
|
return |
|
|
|
} |
|
|
|
log.Printf("send image to %v", msg.Message) |
|
|
|
log.Printf("Type of msg.Message: %T", msg.Message) |
|
|
|
// log.Printf("send image to %v", msg.Message)
|
|
|
|
// log.Printf("Type of msg.Message: %T", msg.Message)
|
|
|
|
paths, ok := msg.Message.([]interface{}) |
|
|
|
log.Printf("paths: %v", paths) |
|
|
|
//log.Printf("paths: %v", paths)
|
|
|
|
if !ok { |
|
|
|
libs.ErrorMsg(w, "HandleMessage message error") |
|
|
|
return |
|
|
@ -78,7 +76,7 @@ func HandlerSendImg(w http.ResponseWriter, r *http.Request) { |
|
|
|
// 处理多张图片
|
|
|
|
if fileInfo, err := os.Stat(filePath); err == nil { |
|
|
|
if !fileInfo.IsDir() { |
|
|
|
sendImage(filePath, toIp, msg) |
|
|
|
handleFile(filePath, toIp, msg) |
|
|
|
} |
|
|
|
} else { |
|
|
|
continue |
|
|
@ -87,121 +85,65 @@ func HandlerSendImg(w http.ResponseWriter, r *http.Request) { |
|
|
|
libs.SuccessMsg(w, nil, "图片发送成功") |
|
|
|
} |
|
|
|
|
|
|
|
func sendImage(filePath string, toIp string, message UdpMessage) { |
|
|
|
// 打开文件
|
|
|
|
file, err := os.Open(filePath) |
|
|
|
if err != nil { |
|
|
|
log.Fatalf("Failed to open file: %v", err) |
|
|
|
} |
|
|
|
defer file.Close() |
|
|
|
|
|
|
|
// 获取文件大小
|
|
|
|
fileInfo, err := file.Stat() |
|
|
|
if err != nil { |
|
|
|
log.Fatalf("Failed to get file info: %v", err) |
|
|
|
} |
|
|
|
fileSize := fileInfo.Size() |
|
|
|
|
|
|
|
// 读取整个文件
|
|
|
|
data := make([]byte, fileSize) |
|
|
|
_, err = file.Read(data) |
|
|
|
if err != nil { |
|
|
|
log.Fatalf("Failed to read file: %v", err) |
|
|
|
} |
|
|
|
|
|
|
|
// 创建文件块
|
|
|
|
chunk := FileChunk{ |
|
|
|
Data: data, |
|
|
|
Checksum: calculateChecksum(data), |
|
|
|
Timestamp: time.Now(), |
|
|
|
Filename: filepath.Base(file.Name()), |
|
|
|
} |
|
|
|
message.Message = chunk |
|
|
|
// 将文件块转换为 JSON 格式
|
|
|
|
data, err = json.Marshal(message) |
|
|
|
if err != nil { |
|
|
|
log.Fatalf("Failed to marshal chunk: %v", err) |
|
|
|
} |
|
|
|
|
|
|
|
// 发送文件块
|
|
|
|
port := "56780" |
|
|
|
addr, err := net.ResolveUDPAddr("udp4", fmt.Sprintf("%s:%s", toIp, port)) |
|
|
|
if err != nil { |
|
|
|
log.Fatalf("Failed to resolve UDP address: %v", err) |
|
|
|
} |
|
|
|
|
|
|
|
conn, err := net.DialUDP("udp4", nil, addr) |
|
|
|
if err != nil { |
|
|
|
log.Fatalf("Failed to dial UDP address: %v", err) |
|
|
|
} |
|
|
|
defer conn.Close() |
|
|
|
|
|
|
|
_, err = conn.Write(data) |
|
|
|
if err != nil { |
|
|
|
log.Printf("Failed to write data: %v", err) |
|
|
|
} |
|
|
|
|
|
|
|
fmt.Printf("发送图片 %s 到 %s 成功\n", filePath, toIp) |
|
|
|
} |
|
|
|
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) {
|
|
|
|
// 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 HandleViewImg(w http.ResponseWriter, r *http.Request) { |
|
|
|
img := r.URL.Query().Get("img") |
|
|
|
if img == "" { |
|
|
|