zip.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package utils
  2. import (
  3. "archive/zip"
  4. "fmt"
  5. "io"
  6. "os"
  7. "path/filepath"
  8. "strings"
  9. )
  10. // 解压
  11. func Unzip(zipFile string, destDir string) ([]string, error) {
  12. zipReader, err := zip.OpenReader(zipFile)
  13. var paths []string
  14. if err != nil {
  15. return []string{}, err
  16. }
  17. defer zipReader.Close()
  18. for _, f := range zipReader.File {
  19. if strings.Index(f.Name, "..") > -1 {
  20. return []string{}, fmt.Errorf("%s 文件名不合法", f.Name)
  21. }
  22. fpath := filepath.Join(destDir, f.Name)
  23. paths = append(paths, fpath)
  24. if f.FileInfo().IsDir() {
  25. os.MkdirAll(fpath, os.ModePerm)
  26. } else {
  27. if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
  28. return []string{}, err
  29. }
  30. inFile, err := f.Open()
  31. if err != nil {
  32. return []string{}, err
  33. }
  34. defer inFile.Close()
  35. outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
  36. if err != nil {
  37. return []string{}, err
  38. }
  39. defer outFile.Close()
  40. _, err = io.Copy(outFile, inFile)
  41. if err != nil {
  42. return []string{}, err
  43. }
  44. }
  45. }
  46. return paths, nil
  47. }
  48. func ZipFiles(deptname string, depts []string, oldForm, newForm string) error {
  49. newZipFile, err := os.Create(deptname)
  50. if err != nil {
  51. return err
  52. }
  53. defer func() {
  54. _ = newZipFile.Close()
  55. }()
  56. zipWriter := zip.NewWriter(newZipFile)
  57. defer func() {
  58. _ = zipWriter.Close()
  59. }()
  60. // 把depts添加到zip中
  61. for _, dept := range depts {
  62. err = func(dept string) error {
  63. zipFile, err := os.Open(dept)
  64. if err != nil {
  65. return err
  66. }
  67. defer zipFile.Close()
  68. // 获取dept的基础信息
  69. info, err := zipFile.Stat()
  70. if err != nil {
  71. return err
  72. }
  73. header, err := zip.FileInfoHeader(info)
  74. if err != nil {
  75. return err
  76. }
  77. // 使用上面的FileInforHeader() 就可以把文件保存的路径替换成我们自己想要的了,如下面
  78. header.Name = strings.Replace(dept, oldForm, newForm, -1)
  79. // 优化压缩
  80. // 更多参考see http://golang.org/pkg/archive/zip/#pkg-constants
  81. header.Method = zip.Deflate
  82. writer, err := zipWriter.CreateHeader(header)
  83. if err != nil {
  84. return err
  85. }
  86. if _, err = io.Copy(writer, zipFile); err != nil {
  87. return err
  88. }
  89. return nil
  90. }(dept)
  91. if err != nil {
  92. return err
  93. }
  94. }
  95. return nil
  96. }