github.com/pavlo67/common@v0.5.3/common/ziplib/zip.go (about) 1 package ziplib 2 3 import ( 4 "archive/zip" 5 "bytes" 6 "fmt" 7 "io" 8 "os" 9 10 "github.com/pkg/errors" 11 ) 12 13 const onUnzipFile = "on ziplib.UnzipFile()" 14 15 func UnzipFile(sourceFilename, filename string) ([]byte, error) { 16 r, err := zip.OpenReader(sourceFilename) 17 if err != nil { 18 return nil, fmt.Errorf(onUnzipFile+": can't zip.OpenReader(%s): %s", sourceFilename, err) 19 } 20 defer r.Close() 21 22 for _, f := range r.File { 23 24 if f.Name == filename || filename == "" { 25 if f.FileInfo().IsDir() { 26 return nil, fmt.Errorf(onUnzipFile+": requested file (%s) is a directory", filename) 27 } 28 } 29 30 rc, err := f.Open() 31 if err != nil { 32 return nil, fmt.Errorf(onUnzipFile+": on fOpen() got %s", err) 33 } 34 35 buffer := bytes.NewBuffer(nil) 36 _, err = io.Copy(buffer, rc) 37 rc.Close() 38 39 return buffer.Bytes(), nil 40 } 41 42 return nil, fmt.Errorf(onUnzipFile+": requested file (%s) isn't found", filename) 43 } 44 45 type ToZip struct { 46 Data []byte 47 Filename string 48 } 49 50 const onZip = "on ziplib.Zip()" 51 52 func ZipFiles(targetFilename string, content []ToZip, perm os.FileMode) ([]byte, error) { 53 buffer := bytes.NewBuffer(nil) 54 zipWriter := zip.NewWriter(buffer) 55 56 for _, c := range content { 57 w1, err := zipWriter.Create(c.Filename) 58 if err != nil { 59 return nil, errors.Wrap(err, onZip) 60 } 61 if _, err := io.Copy(w1, bytes.NewBuffer(c.Data)); err != nil { 62 return nil, errors.Wrap(err, onZip) 63 } 64 } 65 zipWriter.Close() 66 67 zippedBytes := buffer.Bytes() 68 69 if err := os.WriteFile(targetFilename, zippedBytes, perm); err != nil { 70 return nil, errors.Wrap(err, onZip) 71 } 72 73 return zippedBytes, nil 74 }