1.golang文件传输
对文件进行压缩,同时考虑了Linux 和 Wins 目录差异
func main() {
srcDir:="E:/xx/v1"
zipFileName:="E:/xx/v1_zip.zip"
Zip(srcDir, zipFileName)
}
// 打包成zip文件
func Zip(src_dir string, zip_file_name string) {
// 预防:旧文件无法覆盖
os.RemoveAll(zip_file_name)
// 创建:zip文件
zipfile, _ := os.Create(zip_file_name)
defer zipfile.Close()
// 打开:zip文件
archive := zip.NewWriter(zipfile)
defer archive.Close()
// 遍历路径信息
filepath.Walk(src_dir, func(path string, info os.FileInfo, _ error) error {
// 如果是源路径,提前进行下一个遍历
if path == src_dir {
return nil
}
header, _ := zip.FileInfoHeader(info)
path=strings.ReplaceAll(path,"\\","/") // 对同时兼容Linux 和 win 进行处理
header.Name = strings.TrimPrefix(path, src_dir) // +`/`
beego.Info(header.Name,path,src_dir) // pictures\10.jpg E:xx\V1\pictures\10.jpg E:\xx\V1
// 判断:文件是不是文件夹
if info.IsDir() {
header.Name += `/`
} else {
// 设置:zip的文件压缩算法
header.Method = zip.Deflate
}
// 创建:压缩包头部信息
writer, _ := archive.CreateHeader(header)
if !info.IsDir() {
file, _ := os.Open(path)
defer file.Close()
io.Copy(writer, file)
}
return nil
})
}
2. http 文件传输
server端
package main
import (
"io"
"net/http"
"os"
)
func uploadHandler(w http.ResponseWriter, r *http.Request) {
file, err := os.Create("./newFile.txt")
if err != nil {
panic(err)
}
_, err = io.Copy(file, r.Body)
if err != nil {
panic(err)
}
w.Write([]byte("upload success"))
}
func main() {
http.HandleFunc("/upload", uploadHandler)
http.ListenAndServe(":5050", nil)
}
client端
package main
import (
"fmt"
"github.com/astaxie/beego/logs"
"io/ioutil"
"net/http"
"os"
)
func main() {
file, err := os.Open("E:\\t.txt")
if err != nil {
logs.Error(err)
panic(err)
}
defer file.Close()
res, err := http.Post("http://127.0.0.1:5050/upload", "binary/octet-stream", file)
if err != nil {
panic(err)
}
defer res.Body.Close()
message, _ := ioutil.ReadAll(res.Body)
fmt.Printf(string(message))
}