并发压缩文件

package deal

import (
	"archive/zip"
	"bytes"
	"fmt"
	"github.com/nahid/gohttp"
	"io"
	"io/ioutil"
	"os"
)

const zipName = "test.zip"

type FileInfo struct {
	Path string `json:"path"`
	Url  string `json:"url"`
}

type RemoteResult struct {
	Url  string
	Path string
	Buf  bytes.Buffer
	Err  error
}

func ZipTest() {
	var fileList []FileInfo
	var zipPath string
	var err error
	oneFile := FileInfo{
		Path: "/根目录/酒杯.jpg",
		Url:  "https://dss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1904210913,3227016391&fm=26&gp=0.jpg",
	}

	twoFile := FileInfo{
		Path: "/根目录/二级目录/背影.jpg",
		Url:  "https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1441963370,861939009&fm=26&gp=0.jpg",
	}
	fileList = append(fileList, oneFile, twoFile)

	zipPath, err = zipFile(zipName, fileList)
	CheckErr(err)
	fmt.Printf("zipPath: %s\r\n", zipPath)

}

// 处理文件
func zipFile(zipName string, fis []FileInfo) (string, error) {
	var err error
	// 压缩文件
	err = CompressFile(fis, zipName)
	CheckErr(err)
	return zipName, nil
}

// 压缩文件
func CompressFile(fileList []FileInfo, zName string) (err error) {
	buf := new(bytes.Buffer)
	// 创建一个压缩文档
	zw := zip.NewWriter(buf)
	// 处理文件URL
	if len(fileList) > 0 {
		// 并发获取URL内容
		resultChan := make(chan RemoteResult)
		defer close(resultChan)
		for _, fi := range fileList {
			go getUrlByte(fi.Url, fi.Path, resultChan)
		}
		for i := 0; i < len(fileList); i++ {
			res := <-resultChan
			CheckErr(res.Err)
			// 写入内容
			var zww io.Writer
			zww, err = zw.Create(res.Path)
			if err != nil {
				return
			}
			if _, err = io.Copy(zww, &res.Buf); err != nil {
				return
			}
		}

	}
	// 关闭压缩文档
	err = zw.Close()
	CheckErr(err)

	// 将压缩文档内容写入文件
	f, err := os.OpenFile(zName, os.O_CREATE|os.O_WRONLY, 0666)
	CheckErr(err)
	_, err = buf.WriteTo(f)
	CheckErr(err)
	return nil
}

//  获取URL内容 失败为空
func getUrlByte(url, path string, resultChan chan RemoteResult) {
	var resp *gohttp.Response
	var err error
	var b []byte
	req := gohttp.NewRequest()
	resp, err = req.Get(url)
	if err != nil {
		return
	}
	if resp.GetStatusCode() == 200 {
		resBody := resp.GetBody()
		b, err = ioutil.ReadAll(resBody)
		if err != nil {
			return
		}
	}
	resultChan <- RemoteResult{Url: url, Path: path, Buf: *bytes.NewBuffer(b), Err: err}
}

// 处理错误
func CheckErr(err error) {
	if err != nil {
		panic(err)
	}
}

参考链接:https://www.cnblogs.com/hyhy904/p/10995883.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值