files.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package zip
  2. import (
  3. "archive/zip"
  4. "io"
  5. "os"
  6. )
  7. // Files compresses one or many files into a single zip archive file.
  8. // Credits: https://golangcode.com/create-zip-files-in-go/
  9. func Files(filename string, files []string) error {
  10. arc, err := os.Create(filename)
  11. if err != nil {
  12. return err
  13. }
  14. defer arc.Close()
  15. writer := zip.NewWriter(arc)
  16. defer writer.Close()
  17. for _, file := range files {
  18. in, err := os.Open(file)
  19. if err != nil {
  20. return err
  21. }
  22. defer in.Close()
  23. info, err := in.Stat()
  24. if err != nil {
  25. return err
  26. }
  27. header, err := zip.FileInfoHeader(info)
  28. if err != nil {
  29. return err
  30. }
  31. // Using FileInfoHeader() above only uses the basename of the file. If we want
  32. // to preserve the folder structure we can overwrite this with the full path.
  33. header.Name = file
  34. // Change to deflate to gain better compression
  35. // see http://golang.org/pkg/archive/zip/#pkg-constants
  36. header.Method = zip.Deflate
  37. w, err := writer.CreateHeader(header)
  38. if err != nil {
  39. return err
  40. }
  41. if _, err = io.Copy(w, in); err != nil {
  42. return err
  43. }
  44. }
  45. return nil
  46. }