golang 文件压缩 & http 文件传输

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值