123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package compress
- import (
- "bytes"
- "compress/gzip"
- "encoding/json"
- "io"
- "os"
- )
- // DoGzip 压缩bytes内容到指定文件
- func DoGzip(content []byte, path string, fileName string) error {
- gzFile, err := os.Create(path)
- if err != nil {
- return err
- }
- defer gzFile.Close()
- gzipWriter := gzip.NewWriter(gzFile)
- defer gzipWriter.Close()
- gzipWriter.Name = fileName
- _, err = gzipWriter.Write(content)
- if err != nil {
- return err
- }
- return nil
- }
- // UnGzip 解压文件
- func UnGzip(path string) (content []byte, err error) {
- gzipFile, err := os.Open(path)
- if err != nil {
- return
- }
- defer gzipFile.Close()
- gzipReader, err := gzip.NewReader(gzipFile)
- if err != nil {
- return
- }
- defer gzipReader.Close()
- var buf bytes.Buffer
- _, err = io.Copy(&buf, gzipReader)
- if err != nil {
- return nil, err
- }
- return buf.Bytes(), nil
- }
- func GzipEncode(input []byte) ([]byte, error) {
- // 创建一个新的 byte 输出流
- var buf bytes.Buffer
- // 创建一个新的 gzip 输出流
- //NoCompression = flate.NoCompression // 不压缩
- //BestSpeed = flate.BestSpeed // 最快速度
- //BestCompression = flate.BestCompression // 最佳压缩比
- //DefaultCompression = flate.DefaultCompression // 默认压缩比
- //gzip.NewWriterLevel()
- gzipWriter := gzip.NewWriter(&buf)
- defer gzipWriter.Close()
- // 将 input byte 数组写入到此输出流中
- _, err := gzipWriter.Write(input)
- if err != nil {
- return nil, err
- }
- // 返回压缩后的 bytes 数组
- return buf.Bytes(), nil
- }
- func GzipDecode(input []byte) ([]byte, error) {
- // 创建一个新的 gzip.Reader
- bytesReader := bytes.NewReader(input)
- gzipReader, err := gzip.NewReader(bytesReader)
- if err != nil {
- return nil, err
- }
- defer gzipReader.Close()
- buf := new(bytes.Buffer)
- // 从 Reader 中读取出数据
- if _, err := buf.ReadFrom(gzipReader); err != nil {
- return nil, err
- }
- return buf.Bytes(), nil
- }
- // MarshalJsonAndGzip 压缩字符
- func MarshalJsonAndGzip(data interface{}) ([]byte, error) {
- marshalData, err := json.Marshal(data)
- if err != nil {
- return nil, err
- }
- gzipData, err := GzipEncode(marshalData)
- if err != nil {
- return nil, err
- }
- return gzipData, err
- }
- // UnmarshalDataFromJsonWithGzip 解压字符
- func UnmarshalDataFromJsonWithGzip(input []byte, output interface{}) error {
- decodeData, err := GzipDecode(input)
- if err != nil {
- return err
- }
- err = json.Unmarshal(decodeData, output)
- if err != nil {
- return err
- }
- return nil
- }
|