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)
}
}
并发压缩文件
最新推荐文章于 2023-12-23 08:00:00 发布