fix
liujiandao
2024-04-28 de4bcd1dead50b05f716bc5718be5540bdb96783
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package utils
 
import (
    "archive/zip"
    "io"
    "os"
    "strings"
)
 
//@author: [piexlmax](https://github.com/piexlmax)
//@function: ZipFiles
//@description: 压缩文件
//@param: filename string, files []string, oldForm, newForm string
//@return: error
 
func ZipFiles(filename string, files []string, oldForm, newForm string) error {
    newZipFile, err := os.Create(filename)
    if err != nil {
        return err
    }
    defer func() {
        _ = newZipFile.Close()
    }()
 
    zipWriter := zip.NewWriter(newZipFile)
    defer func() {
        _ = zipWriter.Close()
    }()
 
    // 把files添加到zip中
    for _, file := range files {
 
        err = func(file string) error {
            zipFile, err := os.Open(file)
            if err != nil {
                return err
            }
            defer zipFile.Close()
            // 获取file的基础信息
            info, err := zipFile.Stat()
            if err != nil {
                return err
            }
 
            header, err := zip.FileInfoHeader(info)
            if err != nil {
                return err
            }
 
            // 使用上面的FileInforHeader() 就可以把文件保存的路径替换成我们自己想要的了,如下面
            header.Name = strings.Replace(file, oldForm, newForm, -1)
 
            // 优化压缩
            // 更多参考see http://golang.org/pkg/archive/zip/#pkg-constants
            header.Method = zip.Deflate
 
            writer, err := zipWriter.CreateHeader(header)
            if err != nil {
                return err
            }
            if _, err = io.Copy(writer, zipFile); err != nil {
                return err
            }
            return nil
        }(file)
        if err != nil {
            return err
        }
    }
    return nil
}