reader.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package rest
  2. import (
  3. "io"
  4. "os"
  5. )
  6. type IReadCloserLen interface {
  7. io.ReadCloser
  8. Len() int64
  9. }
  10. func NewReadCloserLen(rc io.ReadCloser, len int64) IReadCloserLen {
  11. return &readCloserLen{rc, len}
  12. }
  13. type readCloserLen struct {
  14. io.ReadCloser
  15. size int64
  16. }
  17. func (s *readCloserLen) Len() int64 {
  18. return s.size
  19. }
  20. func NewTemporaryFile(size int64, r io.Reader) (IReadCloserLen, IErrorArgs) {
  21. // Создаем временный файл
  22. f, err := os.CreateTemp("", "*")
  23. if err != nil {
  24. return nil, ErrorMessage("ErrTempFileCrete", err.Error())
  25. }
  26. if _, err := io.CopyN(f, r, size); err != nil {
  27. f.Close()
  28. os.Remove(f.Name())
  29. return nil, ErrorMessage("ErrTempFileCopy", err.Error())
  30. }
  31. tmp := &TemporaryFile{
  32. File: f,
  33. size: size,
  34. }
  35. return tmp, nil
  36. }
  37. type TemporaryFile struct {
  38. *os.File
  39. size int64
  40. }
  41. func (s *TemporaryFile) Len() int64 {
  42. return s.size
  43. }
  44. func (s *TemporaryFile) Close() error {
  45. if err := s.File.Close(); err != nil {
  46. return err
  47. }
  48. return os.Remove(s.File.Name())
  49. }
  50. type IReadCloser interface {
  51. io.ReadCloser
  52. Len() int64
  53. }