package main
import (
"archive/zip"
"bytes"
"fmt"
"github.com/nahid/gohttp"
"io"
"io/ioutil"
"log"
"os"
)
type FileInfo struct {
Name string `json:"name"`
Path string `json:"path"`
Url string `json:"url"`
}
func main() {
var fis []FileInfo
fi1 := FileInfo{
Name: "根目录",
Path: "/根目录",
Url: "",
}
fi2 := FileInfo{
Name: "四级目录",
Path: "/根目录/四级目录",
Url: "",
}
fi3 := FileInfo{
Name: "酒杯.jpg",
Path: "/根目录/酒杯.jpg",
Url: "https://dss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1904210913,3227016391&fm=26&gp=0.jpg",
}
fi4 := FileInfo{
Name: "背影.jpg",
Path: "/根目录/二级目录/背影.jpg",
Url: "https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1441963370,861939009&fm=26&gp=0.jpg",
}
fis = append(fis, fi1, fi2, fi3, fi4)
var fPath string
var err error
fPath, err = DealFile("ceshi", fis)
dealErr(err)
fmt.Println("fPath: ", fPath)
}
// 处理文件
func DealFile(zipName string, fis []FileInfo) (string, error) {
var err error
// 压缩文件
zipName += ".zip"
err = CompressFile(fis, zipName)
dealErr(err)
return zipName, nil
}
// 压缩文件
func CompressFile(fis []FileInfo, zName string) (err error) {
buf := new(bytes.Buffer)
// 创建一个压缩文档
w := zip.NewWriter(buf)
// 区分fis 文件URL 目录URL
var urlFis, notUrlFis []FileInfo
if len(fis) > 0 {
for _, fi := range fis {
if fi.Url != "" {
urlFis = append(urlFis, fi)
} else {
notUrlFis = append(notUrlFis, fi)
}
}
}
var iw io.Writer
var b []byte
// 处理目录URL
if len(notUrlFis) > 0 {
for _, fi := range notUrlFis {
iw, err = w.Create(fi.Path + "/")
if err != nil {
return err
}
_, err = iw.Write(b)
if err != nil {
return err
}
}
}
// 处理文件URL
var result []RemoteResult
if len(urlFis) > 0 {
// 并发获取URL内容
resultChan := make(chan RemoteResult)
defer close(resultChan)
for _, fi := range urlFis {
go getUrlByte(fi.Url, resultChan)
}
for i := 0; i < len(urlFis); i++ {
res := <-resultChan
dealErr(res.Err)
result = append(result, res)
}
// 写入内容
for _, fi := range urlFis {
for _, res := range result {
if fi.Url == res.Url {
iw, err = w.Create(fi.Path)
if err != nil {
return err
}
_, err = iw.Write(res.Result)
if err != nil {
return err
}
}
}
}
}
// 关闭压缩文档
err = w.Close()
dealErr(err)
// 将压缩文档内容写入文件
f, err := os.OpenFile(zName, os.O_CREATE|os.O_WRONLY, 0666)
dealErr(err)
_, err = buf.WriteTo(f)
dealErr(err)
return nil
}
// 处理错误
func dealErr(err error) {
if err != nil {
log.Println("err: ", err)
panic(err)
}
}
type RemoteResult struct {
Url string
Result []byte
Err error
}
// 获取URL内容 失败为空
func getUrlByte(url 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, Result: b, Err: err}
}
参考链接:https://www.cnblogs.com/hyhy904/p/10995883.html