• Golang zip压缩及加密


    package zip
    
    import (
    	"github.com/itnotebooks/zip"
    	"io"
    	"log"
    	"os"
    	"path/filepath"
    	"strings"
    )
    
    // ZipLib 递归压缩,默认采用AES256加密方式加密
    // 支持以下加密方式
    // Standard         ZIP标准,安全性最低
    // AES128           AES128位,安全性高
    // AES192           AES192位,安全性高
    // AES256           AES256位,安全性最高,本程序默认采用此加密方式
    func ZipLib(dst, src string, encrypt bool, password, enc string) (err error) {
    	var dstFileBaseName = ""
    
    	// 创建压缩文件对象
    	zfile, err := os.Create(dst)
    	defer zfile.Close()
    
    	if err != nil {
    		return err
    	}
    
    	// 通过文件对象生成写入对象
    	zFileWriter := zip.NewWriter(zfile)
    	defer func() {
    		// 检测一下是否成功关闭
    		if err := zFileWriter.Close(); err != nil {
    			log.Fatalln(err)
    		}
    	}()
    
    	info, err := os.Stat(src)
    	if err != nil {
    		return err
    	}
    
    	var baseDir string
    	if info.IsDir() {
    		baseDir = filepath.Base(src)
    
    		if !strings.HasSuffix(src, "/") {
    			dstName := filepath.Base(dst)
    			dstFileBaseName = strings.TrimSuffix(dstName, filepath.Ext(dstName))
    		}
    	}
    
    	// 将文件写入 zFileWriter 对象 ,可能会有很多个目录及文件,递归处理
    	return filepath.Walk(src, func(path string, fi os.FileInfo, errBack error) (err error) {
    		if errBack != nil {
    			return errBack
    		}
    
    		if strings.HasSuffix(path, ".zip") {
    			return
    		}
    		//创建文件头
    		header, err := zip.FileInfoHeader(fi)
    		if err != nil {
    			return err
    		}
    
    		if baseDir != "" {
    			// 如果原目录是以"/"结尾,表示打包指定目录时不包含该目录
    			if strings.HasSuffix(src, "/") {
    				header.Name = strings.TrimPrefix(path, src)
    			} else {
    				header.Name = filepath.Join(dstFileBaseName, baseDir, strings.TrimPrefix(path, src))
    			}
    		}
    
    		if fi.IsDir() {
    			header.Name += "/"
    		} else {
    			header.Method = zip.Deflate
    
    		}
    
    		var fh io.Writer
    		if encrypt {
    			// 加密方式
    			var encryption = zip.AES256Encryption
    
    			switch enc {
    			case "Standard":
    				encryption = zip.StandardEncryption
    			case "AES128":
    				encryption = zip.AES128Encryption
    			case "AES192":
    				encryption = zip.AES192Encryption
    
    			}
    
    			// 写入文件头信息,并配置密码
    			fh, err = zFileWriter.Encrypt(header, password, encryption)
    		} else {
    			// 写入文件头信息
    			fh, err = zFileWriter.CreateHeader(header)
    		}
    
    		if err != nil {
    			return err
    		}
    
    		// 判断是否是标准文件
    		if !header.Mode().IsRegular() {
    			return nil
    		}
    
    		// 打开要压缩的文件
    		file, err := os.Open(path)
    		defer file.Close()
    		if err != nil {
    			return
    		}
    
    		// 将文件对象拷贝到 writer 结构中
    		ret, err := io.Copy(fh, file)
    		if err != nil {
    			return
    		}
    
    		log.Printf("added: %s, total: %d\n", path, ret)
    
    		return nil
    	})
    }
    
    • 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
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132

    调用

    func TestZipLib(t *testing.T) {
    	enc := "AES256"
    	encrypt := true
    	pass := tools.RandomString(12)
    	baseDir := tools.GetBaseDir()
    	ZipLib(baseDir+"/test/202309.zip", baseDir+"/target/2023-09-07/xxx.csv", encrypt, pass, enc)
    	log.Println("Zip file password:", pass)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    自动化输出带数据的文件名称
    flip-flop with VHDL (dataflow, structure, behavior)
    python如何给正文内容加富文本标签
    C语言用数组实现打印学生成绩,分别打印每名学生的总成绩,平均成绩。每门学科的总成绩,平均成绩
    23.3 Bootstrap 框架4
    【学生个人网页设计作品】使用HMTL制作一个超好看的保护海豚动物网页
    什么是电源高压测试标准?如何测试?测试时要注意什么?
    图片1920x1080分辨率怎么调 ?图片如何修改分辨率?
    S32K1xx的MBD工具箱加载及激活
    nacos客户端连接服务端报Client not connected, current status:STARTING
  • 原文地址:https://blog.csdn.net/SweetHeartHuaZai/article/details/132732495