diff --git a/utils/compress/tar.go b/utils/compress/tar.go new file mode 100644 index 0000000..f7440bd --- /dev/null +++ b/utils/compress/tar.go @@ -0,0 +1,48 @@ +package compress + +import ( + "archive/tar" + "bytes" + "io" +) + +// TARCompress 对数据进行TAR压缩,返回bytes.Buffer和错误信息 +func TARCompress(data []byte) (bytes.Buffer, error) { + var buf bytes.Buffer + tarWriter := tar.NewWriter(&buf) + hdr := &tar.Header{ + Name: "file", + Mode: 0600, + Size: int64(len(data)), + } + if err := tarWriter.WriteHeader(hdr); err != nil { + return buf, err + } + if _, err := tarWriter.Write(data); err != nil { + return buf, err + } + if err := tarWriter.Close(); err != nil { + return buf, err + } + return buf, nil +} + +// TARUnCompress 对已进行TAR压缩的数据进行解压缩,返回字节数组及错误信息 +func TARUnCompress(dataByte []byte) ([]byte, error) { + data := bytes.NewReader(dataByte) + tarReader := tar.NewReader(data) + var result bytes.Buffer + for { + _, err := tarReader.Next() + if err == io.EOF { + break // End of archive + } + if err != nil { + return nil, err + } + if _, err := io.Copy(&result, tarReader); err != nil { + return nil, err + } + } + return result.Bytes(), nil +} diff --git a/utils/compress/zip.go b/utils/compress/zip.go new file mode 100644 index 0000000..b898dfd --- /dev/null +++ b/utils/compress/zip.go @@ -0,0 +1,47 @@ +package compress + +import ( + "archive/zip" + "bytes" + "io" +) + +// ZIPCompress 对数据进行ZIP压缩,返回bytes.Buffer和错误信息 +func ZIPCompress(data []byte) (bytes.Buffer, error) { + var buf bytes.Buffer + zipWriter := zip.NewWriter(&buf) + f, err := zipWriter.Create("file") + if err != nil { + return buf, err + } + _, err = f.Write(data) + if err != nil { + return buf, err + } + if err := zipWriter.Close(); err != nil { + return buf, err + } + return buf, nil +} + +// ZIPUnCompress 对已进行ZIP压缩的数据进行解压缩,返回字节数组及错误信息 +func ZIPUnCompress(dataByte []byte) ([]byte, error) { + data := bytes.NewReader(dataByte) + zipReader, err := zip.NewReader(data, int64(len(dataByte))) + if err != nil { + return nil, err + } + var result bytes.Buffer + for _, f := range zipReader.File { + rc, err := f.Open() + if err != nil { + return nil, err + } + _, err = io.Copy(&result, rc) + if err != nil { + return nil, err + } + rc.Close() + } + return result.Bytes(), nil +}