github.com/JohanShen/go-utils@v1.1.4-0.20201117124024-901319a2b2a0/utils/zip.go (about)

     1  package utils
     2  
     3  import (
     4  	"bytes"
     5  	"compress/gzip"
     6  	"compress/zlib"
     7  	"fmt"
     8  	"io"
     9  )
    10  
    11  type Closer interface {
    12  	Close() error
    13  }
    14  
    15  func ioClose(obj Closer) {
    16  	if obj != nil {
    17  		if err := obj.Close(); err != nil {
    18  			fmt.Println(err)
    19  		}
    20  	}
    21  }
    22  
    23  //zip压缩
    24  func ZipBytes(data []byte) ([]byte, error) {
    25  
    26  	var in bytes.Buffer
    27  	//z:=zlib.NewWriter(&in)
    28  	z, err := zlib.NewWriterLevel(&in, zlib.DefaultCompression)
    29  	if err != nil {
    30  		return []byte{}, err
    31  	}
    32  	_, err = z.Write(data)
    33  	if err != nil {
    34  		return []byte{}, err
    35  	}
    36  	ioClose(z)
    37  	return in.Bytes(), nil
    38  }
    39  
    40  //zip解压
    41  func UZipBytes(data []byte) ([]byte, error) {
    42  	var out bytes.Buffer
    43  	var in bytes.Buffer
    44  	in.Write(data)
    45  	r, err := zlib.NewReader(&in)
    46  	if err != nil {
    47  		return []byte{}, err
    48  	}
    49  
    50  	_, err = io.Copy(&out, r)
    51  	if err != nil {
    52  		return []byte{}, err
    53  	}
    54  	ioClose(r)
    55  	return out.Bytes(), nil
    56  }
    57  
    58  //压缩
    59  func GZipBytes(data []byte) ([]byte, error) {
    60  	var input bytes.Buffer
    61  	//g := gzip.NewWriter(&input)
    62  	g, err := gzip.NewWriterLevel(&input, gzip.DefaultCompression)
    63  	if err != nil {
    64  		return []byte{}, err
    65  	}
    66  	_, err = g.Write(data)
    67  	if err != nil {
    68  		return []byte{}, err
    69  	}
    70  	ioClose(g)
    71  	return input.Bytes(), nil
    72  }
    73  
    74  //解压
    75  func UGZipBytes(data []byte) ([]byte, error) {
    76  	var out bytes.Buffer
    77  	var in bytes.Buffer
    78  	in.Write(data)
    79  	r, err := gzip.NewReader(&in)
    80  	if err != nil {
    81  		return []byte{}, err
    82  	}
    83  	_, err = io.Copy(&out, r)
    84  	if err != nil {
    85  		return []byte{}, err
    86  	}
    87  	ioClose(r)
    88  	return out.Bytes(), nil
    89  }