用go语言实现文件上传功能
所用模块: fmt, io, os, net
发送端 send.go
// 发送端 send.go
package main
import (
"fmt"
"io"
"net"
"os"
)
// 发送文件
func sendFile(file *os.File, client net.Conn) (err error) {
err = nil
buf := make([]byte, 1024*4)
var n int
for {
n, err = file.Read(buf)
if err != nil {
if err == io.EOF {
return nil
} else {
fmt.Println("file.Read err:", err)
}
return
}
_, err = client.Write(buf[:n])
if err != nil {
fmt.Println("client.Write err:", err)
return err
}
}
return
}
func main() {
// 1.接收输入文件名
fmt.Println("请输要发送的文件名:")
var filePath string
var f *os.File
var err error
for {
fmt.Scan(&filePath)
// 2.打开文件
f, err = os.Open(filePath)
if err != nil {
fmt.Println("Open err:", err)
fmt.Println("请输要发送的文件名:")
}
break
}
defer f.Close()
// 3.发送文件名
fileInfo, err := os.Stat(filePath)
if err != nil {
fmt.Println("err:", err)
return
}
var client net.Conn
var n int
client, err = net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println("dial err:", err)
return
}
defer client.Close()
_, err = client.Write([]byte(fileInfo.Name()))
// 4.等待ok,发送文件
buf := make([]byte, 1024*4)
n, err = client.Read(buf)
if err != nil {
fmt.Println("read err:", err)
return
}
// 收到ok,开始发送文件
if "ok" == string(buf[:n]) {
err = sendFile(f, client)
if err != nil {
fmt.Println("发送失败:", err)
} else {
fmt.Println("发送完成!")
}
}
}
接收端 receive.go
// 接收端 receive.go
package main
import (
"fmt"
"io"
"net"
"os"
)
func main() {
listen, err := net.Listen("tcp", "127.0.0.1:8080")
defer listen.Close()
if err != err {
fmt.Println("listen err:", err)
return
}
buf := make([]byte, 1024*4)
// 等待连接
var conn net.Conn
conn, err = listen.Accept()
defer conn.Close()
if err != nil {
fmt.Println("Accept err:", err)
return
}
// 读取
var n int
n, err = conn.Read(buf)
if err != nil {
fmt.Println("read err:", err)
return
}
// 保存文件名
fileName := string(buf[:n])
var f *os.File
f, err = os.Create(fileName)
defer f.Close()
if err != nil {
fmt.Println("create err:", err)
return
}
n, err = conn.Write([]byte("ok"))
if err != nil {
fmt.Println("write err:", err)
return
}
// 读取传输文件内容
for {
n, err = conn.Read(buf)
if err != nil {
if err != io.EOF {
fmt.Println("read err:", err)
}
fmt.Println("文件接收完成!")
return
}
if n == 0 {
fmt.Println("文件接收完成!")
return
}
// 写文件
n, err = f.Write(buf[:n])
if err != nil {
fmt.Println("file write err:", err)
return
}
}
}