stream.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package zip
  2. import (
  3. "archive/zip"
  4. "io"
  5. "os"
  6. "path/filepath"
  7. )
  8. // A StreamArchive represents a streamable archive.
  9. type StreamArchive struct {
  10. *zip.Writer
  11. }
  12. // NewStreamArachive returns a new streamable archive with given io.Writer.
  13. // It's caller's responsibility to close io.Writer and streamer after operation.
  14. func NewStreamArachive(w io.Writer) *StreamArchive {
  15. return &StreamArchive{zip.NewWriter(w)}
  16. }
  17. // StreamFile streams a file or directory entry into StreamArchive.
  18. func (s *StreamArchive) StreamFile(relPath string, fi os.FileInfo, data []byte) error {
  19. if fi.IsDir() {
  20. fh, err := zip.FileInfoHeader(fi)
  21. if err != nil {
  22. return err
  23. }
  24. fh.Name = relPath + "/"
  25. if _, err = s.Writer.CreateHeader(fh); err != nil {
  26. return err
  27. }
  28. } else {
  29. fh, err := zip.FileInfoHeader(fi)
  30. if err != nil {
  31. return err
  32. }
  33. fh.Name = filepath.Join(relPath, fi.Name())
  34. fh.Method = zip.Deflate
  35. fw, err := s.Writer.CreateHeader(fh)
  36. if err != nil {
  37. return err
  38. } else if _, err = fw.Write(data); err != nil {
  39. return err
  40. }
  41. }
  42. return nil
  43. }
  44. // StreamReader streams data from io.Reader to StreamArchive.
  45. func (s *StreamArchive) StreamReader(relPath string, fi os.FileInfo, r io.Reader) (err error) {
  46. fh, err := zip.FileInfoHeader(fi)
  47. if err != nil {
  48. return err
  49. }
  50. fh.Name = filepath.Join(relPath, fi.Name())
  51. fw, err := s.Writer.CreateHeader(fh)
  52. if err != nil {
  53. return err
  54. }
  55. _, err = io.Copy(fw, r)
  56. return err
  57. }