func Unarchive(src io.Reader, dir string) error {
	buff := bytes.NewBuffer([]byte{})
	size, err := io.Copy(buff, src)
	if err != nil {
		return err
	}
	reader := bytes.NewReader(buff.Bytes())
	zip, err := zip.NewReader(reader, size)
	if err != nil {
		return err
	}
	for _, f := range zip.File {
		rc, err := f.Open()
		if err != nil {
			return err
		}
		bytes, err := ioutil.ReadAll(rc)
		if err != nil {
			return err
		}
		path := filepath.Join(dir, f.Name)
		if err := ioutil.WriteFile(path, bytes, os.ModePerm); err != nil {
			return err
		}
		if err := rc.Close(); err != nil {
			return err
		}
	}
	return nil
}
Unarchive decodes the source in a zip and writes it to a directory
package zip
import (
	"archive/zip"
	"bytes"
	"io"
	"io/ioutil"
	"os"
	"path/filepath"
)