11package util
22
33import (
4+ "archive/zip"
45 "crypto/rand"
56 "encoding/base64"
67 "errors"
@@ -14,8 +15,6 @@ import (
1415 "strconv"
1516 "strings"
1617 "time"
17-
18- "github.com/jhoonb/archivex"
1918)
2019
2120// Expand tilde in paths
@@ -33,44 +32,105 @@ func Expand(input string) string {
3332 return input
3433}
3534
35+ // add folder to the zip file
36+ func addFolderToZip (zipWriter * zip.Writer , source , target string ) error {
37+
38+ //explore the folder and add all to the zip
39+ return filepath .Walk (source , func (path string , info os.FileInfo , err error ) error {
40+ if err != nil {
41+ return err
42+ }
43+
44+ header , err := zip .FileInfoHeader (info )
45+ if err != nil {
46+ return err
47+ }
48+ header .Name = path
49+
50+ if info .IsDir () {
51+ header .Name += "/"
52+ } else {
53+ header .Method = zip .Deflate
54+ }
55+
56+ writer , err := zipWriter .CreateHeader (header )
57+ if err != nil {
58+ return err
59+ }
60+
61+ if info .IsDir () {
62+ return nil
63+ }
64+
65+ file , err := os .Open (path )
66+ if err != nil {
67+ return err
68+ }
69+ defer file .Close ()
70+
71+ _ , err = io .Copy (writer , file )
72+ return err
73+ })
74+ }
75+
76+ // add files to the zip file
77+ func addFileToZip (zipWriter * zip.Writer , fileToAdd string ) error {
78+ f1 , err := os .Open (fileToAdd )
79+ if err != nil {
80+ return err
81+ }
82+ defer f1 .Close ()
83+
84+ w1 , err := zipWriter .Create (filepath .Base (fileToAdd ))
85+ if err != nil {
86+ panic (err )
87+ }
88+ if _ , err := io .Copy (w1 , f1 ); err != nil {
89+ panic (err )
90+ }
91+
92+ return nil
93+ }
94+
3695// ZipFiles and return the resulting zip's filename
3796func ZipFiles (files []string ) (string , error ) {
38- zip := new (archivex. ZipFile )
39- tmpfile , err := ioutil . TempFile ("" , "qrcp" )
97+ //create temporary file
98+ tmpfile , err := os . CreateTemp ("" , "qrcp" )
4099 if err != nil {
41100 return "" , err
42101 }
102+ tempFileName := tmpfile .Name () + ".zip"
43103 tmpfile .Close ()
44- if err := os .Rename (tmpfile .Name (), tmpfile . Name () + ".zip" ); err != nil {
104+ if err := os .Rename (tmpfile .Name (), tempFileName ); err != nil {
45105 return "" , err
46106 }
47- if err := zip .Create (tmpfile .Name () + ".zip" ); err != nil {
107+
108+ //create zip file
109+ zipFile , err := os .Create (tempFileName )
110+ if err != nil {
48111 return "" , err
49112 }
113+ defer zipFile .Close ()
114+
115+ //add files and folder in the zip
116+ zipWriter := zip .NewWriter (zipFile )
117+ defer zipWriter .Close ()
50118 for _ , filename := range files {
51119 fileinfo , err := os .Stat (filename )
52120 if err != nil {
53121 return "" , err
54122 }
55123 if fileinfo .IsDir () {
56- if err := zip . AddAll ( filename , true ); err != nil {
124+ if err := addFolderToZip ( zipWriter , filename , tempFileName ); err != nil {
57125 return "" , err
58126 }
59127 } else {
60- file , err := os .Open (filename )
61- if err != nil {
62- return "" , err
63- }
64- defer file .Close ()
65- if err := zip .Add (filename , file , fileinfo ); err != nil {
128+ if err := addFileToZip (zipWriter , filename ); err != nil {
66129 return "" , err
67130 }
68131 }
69132 }
70- if err := zip .Close (); err != nil {
71- return "" , nil
72- }
73- return zip .Name , nil
133+ return tempFileName , nil
74134}
75135
76136// GetRandomURLPath returns a random string of 4 alphanumeric characters
0 commit comments