package archive import ( "archive/zip" "bytes" "io" "io/ioutil" "os" "path/filepath" ) // UnzipArchive will unzip an archive from bytes into the dest destination folder on disk func UnzipArchive(archiveData []byte, dest string) error { zipReader, err := zip.NewReader(bytes.NewReader(archiveData), int64(len(archiveData))) if err != nil { return err } for _, zipFile := range zipReader.File { err := extractFileFromArchive(zipFile, dest) if err != nil { return err } } return nil } func extractFileFromArchive(file *zip.File, dest string) error { f, err := file.Open() if err != nil { return err } defer f.Close() data, err := ioutil.ReadAll(f) if err != nil { return err } fpath := filepath.Join(dest, file.Name) outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode()) if err != nil { return err } _, err = io.Copy(outFile, bytes.NewReader(data)) if err != nil { return err } return outFile.Close() }