+func (u *Utils) ZipFilesToTmpFile(baseDir string, tmpfilename string, fileList []string) (string, error) {
+ //Generate zip file
+ tmpFile, err := ioutil.TempFile("", tmpfilename)
+ if err != nil {
+ return "", fmt.Errorf("Failed to create a tmp file: %w", err)
+ }
+ err = u.ZipFiles(tmpFile, baseDir, fileList)
+ if err != nil {
+ os.Remove(tmpFile.Name())
+ return "", fmt.Errorf("Failed to zip the files: %w", err)
+ }
+ return tmpFile.Name(), nil
+}
+
+func (u *Utils) GetFileFromZip(file *zip.File, filePath string) (string, error) {
+ filename := filepath.Join(filePath, file.Name)
+
+ if file.FileInfo().IsDir() {
+ os.MkdirAll(filename, os.ModePerm)
+ return "", nil
+ }
+
+ if err := os.MkdirAll(filepath.Dir(filename), os.ModePerm); err != nil {
+ return "", fmt.Errorf("mkdir failed %s", filepath.Dir(filename))
+ }
+
+ dstFile, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())
+ if err != nil {
+ return "", fmt.Errorf("openfile failed %s", filename)
+ }
+ defer dstFile.Close()
+
+ fileInArchive, err := file.Open()
+ if err != nil {
+ return "", fmt.Errorf("zip file open failed %s", file.Name)
+ }
+ defer fileInArchive.Close()
+
+ if _, err := io.Copy(dstFile, fileInArchive); err != nil {
+ return "", fmt.Errorf("copy failed %s -> %s", file.Name, filename)
+ }
+ return filename, nil
+
+}
+
+func (u *Utils) UnZipFiles(zippedFile string, filePath string) ([]string, error) {
+ retval := []string{}
+ zipReader, err := zip.OpenReader(zippedFile)
+ if err != nil {
+ return retval, fmt.Errorf("Failed to open zip reader: %w", err)
+ }
+ defer zipReader.Close()
+
+ //fmt.Printf("Reading zipfile: %s\n", zippedFile)
+ for _, file := range zipReader.File {
+ fname, err := u.GetFileFromZip(file, filePath)
+ if err != nil {
+ return retval, fmt.Errorf("Failed to unzip the files: %w", err)
+ }
+ if len(fname) > 0 {
+ retval = append(retval, fname)
+ }
+ }
+ return retval, nil
+}
+