压缩图片文件等

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

原创文章 2 获赞 1 访问量 3664

猜你喜欢

转载自blog.csdn.net/q320036715/article/details/106117436