You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
989 B
Go
58 lines
989 B
Go
package storage
|
|
|
|
import (
|
|
"archive/zip"
|
|
"io"
|
|
"os"
|
|
)
|
|
|
|
func ZipFiles(files []FileUpload, w io.Writer) error {
|
|
zipWriter := zip.NewWriter(w)
|
|
defer zipWriter.Close()
|
|
|
|
// Add files to zip
|
|
for _, file := range files {
|
|
if err := AddFileToZip(zipWriter, file); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// https://golangcode.com/create-zip-files-in-go/
|
|
func AddFileToZip(zipWriter *zip.Writer, file FileUpload) error {
|
|
fileToZip, err := os.Open(GetStoreDestination(file.SHA256 + file.FileExt))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
defer fileToZip.Close()
|
|
|
|
// get file info
|
|
info, err := fileToZip.Stat()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
header, err := zip.FileInfoHeader(info)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Reset original file name
|
|
header.Name = file.FileName
|
|
|
|
// Change to deflate for better compression
|
|
header.Method = zip.Deflate
|
|
|
|
writer, err := zipWriter.CreateHeader(header)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = io.Copy(writer, fileToZip)
|
|
|
|
return nil
|
|
}
|