package rest import ( "io" "os" ) type IReadCloserLen interface { io.ReadCloser Len() int64 } func NewReadCloserLen(rc io.ReadCloser, len int64) IReadCloserLen { return &readCloserLen{rc, len} } func ReadCloserLenFromFile(f *os.File) (IReadCloserLen, error) { fi, err := f.Stat() if err != nil { return nil, err } res := NewReadCloserLen(f, fi.Size()) return res, nil } type readCloserLen struct { io.ReadCloser size int64 } func (s *readCloserLen) Len() int64 { return s.size } func NewTemporaryFile(size int64, r io.Reader) (IReadCloserLen, IErrorArgs) { // Создаем временный файл f, err := os.CreateTemp("", "*") if err != nil { return nil, ErrorMessage("ErrTempFileCrete", err.Error()) } if _, err := io.CopyN(f, r, size); err != nil { f.Close() os.Remove(f.Name()) return nil, ErrorMessage("ErrTempFileCopy", err.Error()) } tmp := &TemporaryFile{ File: f, size: size, } return tmp, nil } type TemporaryFile struct { *os.File size int64 } func (s *TemporaryFile) Len() int64 { return s.size } func (s *TemporaryFile) Close() error { if err := s.File.Close(); err != nil { return err } return os.Remove(s.File.Name()) } type IReadCloser interface { io.ReadCloser Len() int64 }