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  }