reader.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. func ReadCloserLenFromFile(f *os.File) (IReadCloserLen, error) {
  14. fi, err := f.Stat()
  15. if err != nil {
  16. return nil, err
  17. }
  18. res := NewReadCloserLen(f, fi.Size())
  19. return res, nil
  20. }
  21. type readCloserLen struct {
  22. io.ReadCloser
  23. size int64
  24. }
  25. func (s *readCloserLen) Len() int64 {
  26. return s.size
  27. }
  28. func NewTemporaryFile(size int64, r io.Reader) (IReadCloserLen, IErrorArgs) {
  29. // Создаем временный файл
  30. f, err := os.CreateTemp("", "*")
  31. if err != nil {
  32. return nil, ErrorMessage("ErrTempFileCrete", err.Error())
  33. }
  34. if _, err := io.CopyN(f, r, size); err != nil {
  35. f.Close()
  36. os.Remove(f.Name())
  37. return nil, ErrorMessage("ErrTempFileCopy", err.Error())
  38. }
  39. tmp := &TemporaryFile{
  40. File: f,
  41. size: size,
  42. }
  43. return tmp, nil
  44. }
  45. type TemporaryFile struct {
  46. *os.File
  47. size int64
  48. }
  49. func (s *TemporaryFile) Len() int64 {
  50. return s.size
  51. }
  52. func (s *TemporaryFile) Close() error {
  53. if err := s.File.Close(); err != nil {
  54. return err
  55. }
  56. return os.Remove(s.File.Name())
  57. }
  58. type IReadCloser interface {
  59. io.ReadCloser
  60. Len() int64
  61. }