package main import ( "archive/zip" "fmt" "io" "net/http" "os" "path/filepath" "strings" ) //Utilities func download(filedest string, url string) error { resp, err := http.Get(url) if err != nil { return err } defer resp.Body.Close() out, err := os.Create(filedest) if err != nil { return err } defer out.Close() _, err = io.Copy(out, resp.Body) return err } func unzip(src, dest string) ([]string, error) { //store file names available in a array of strings var filenames []string r, err := zip.OpenReader(src) if err != nil { return filenames, err } defer r.Close() for _, f := range r.File { // Skip folders to prevent permission issues if strings.Contains(f.Name, "__MACOSX") { continue } fpath := filepath.Join(dest, f.Name) // Checking for any invalid file paths if !strings.HasPrefix(fpath, filepath.Clean(dest)+string(os.PathSeparator)) { return filenames, fmt.Errorf("%s is an illegal filepath", fpath) } filenames = append(filenames, fpath) if f.FileInfo().IsDir() { os.MkdirAll(fpath, os.ModePerm) continue } // Creating the files in the target directory if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil { return filenames, err } outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) if err != nil { return filenames, err } rc, err := f.Open() if err != nil { return filenames, err } _, err = io.Copy(outFile, rc) outFile.Close() rc.Close() if err != nil { return filenames, err } } return filenames, nil }