zip.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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.Contains(f.Name, "..") {
  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. }