Skip to content
Snippets Groups Projects
zip_utils.go 1.67 KiB
Newer Older
Jano Hendriks's avatar
Jano Hendriks committed
package zip_utils

import (
	"archive/zip"
	"bytes"
	"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/date_utils"
Jano Hendriks's avatar
Jano Hendriks committed
	"io"
	"time"
)

func ZipData(fileName string, data []byte) ([]byte, error) {
	// Create zip
	buf := new(bytes.Buffer)

	// Create a new zip archive.
	zipWriter := zip.NewWriter(buf)

	header := &zip.FileHeader{
		Name:     fileName,
		Method:   zip.Deflate,
		Modified: time.Now(),
	}

	// Write data
	file, err := zipWriter.CreateHeader(header)
	if err != nil {
		return nil, err
	}
	_, err = file.Write(data)
	if err != nil {
		return nil, err
	}

	// Close zip
	err = zipWriter.Close()
	if err != nil {
		return []byte(""), err
	}

	return buf.Bytes(), nil
}

func UnzipData(data []byte) (map[string][]byte, error) {
	// Create a new zip reader.
	zipReader, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
	if err != nil {
		return nil, err
	}

	// Read all the files from zip archive
	var fileData = make(map[string][]byte)
	for _, zipFile := range zipReader.File {
		unzippedData, err := readZipFile(zipFile)
		if err != nil {
			continue
		}

		fileData[zipFile.FileHeader.Name] = unzippedData
	}

	return fileData, nil
}

func readZipFile(zipFile *zip.File) ([]byte, error) {
	zipFileData, err := zipFile.Open()
	if err != nil {
		return nil, err
	}
	defer zipFileData.Close()

	return io.ReadAll(zipFileData)
}

func AddFileToZip(fileName string, fileBytes []byte, zipWriter *zip.Writer) error {
	header := &zip.FileHeader{
		Name:     fileName,
		Method:   zip.Deflate,
		Modified: date_utils.CurrentDate(),
	}
	file, err := zipWriter.CreateHeader(header)
Jano Hendriks's avatar
Jano Hendriks committed
	if err != nil {
		return err
	}
	_, err = file.Write(fileBytes)
	if err != nil {
		return err
	}

	return nil
}