feat: compress 新增 tar 和 zip 解压缩函数

This commit is contained in:
kercylan98 2023-12-23 12:17:29 +08:00
parent 1afae90f69
commit 6bd987fce5
2 changed files with 95 additions and 0 deletions

48
utils/compress/tar.go Normal file
View File

@ -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
}

47
utils/compress/zip.go Normal file
View File

@ -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
}