github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/core/documents/utils.go (about) 1 package documents 2 3 import ( 4 "archive/zip" 5 "bytes" 6 "io" 7 ) 8 9 type Renamer func(string) string 10 11 type ArchiveZip struct { 12 Renamer Renamer 13 b *bytes.Buffer 14 z *zip.Writer 15 16 err error // erreur courante 17 } 18 19 func NewArchiveZip() *ArchiveZip { 20 out := ArchiveZip{b: new(bytes.Buffer)} 21 out.z = zip.NewWriter(out.b) 22 return &out 23 } 24 25 // AddFile ajoute un fichier. La gestion de l'erreur est reporté à 26 // la méthode `Close`. 27 func (a *ArchiveZip) AddFile(name string, content io.Reader) { 28 if a.Renamer != nil { 29 name = a.Renamer(name) 30 } 31 if a.err != nil { 32 return 33 } 34 w, err := a.z.Create(name) 35 if err != nil { 36 a.err = err 37 return 38 } 39 if _, err := io.Copy(w, content); err != nil { 40 a.err = err 41 } 42 } 43 44 // Close termine la création de l'archive et renvoie son contenu. 45 func (a ArchiveZip) Close() (*bytes.Buffer, error) { 46 if a.err != nil { 47 return nil, a.err 48 } 49 if err := a.z.Close(); err != nil { 50 return nil, err 51 } 52 return a.b, nil 53 }