diff options
Diffstat (limited to 'internal/iotools/io.go')
-rw-r--r-- | internal/iotools/io.go | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/internal/iotools/io.go b/internal/iotools/io.go index 5f0c4b72c..f62777b3f 100644 --- a/internal/iotools/io.go +++ b/internal/iotools/io.go @@ -20,6 +20,7 @@ package iotools import ( "io" + "os" ) // ReadFnCloser takes an io.Reader and wraps it to use the provided function to implement io.Closer. @@ -157,3 +158,35 @@ func StreamWriteFunc(write func(io.Writer) error) io.Reader { return pr } + +type tempFileSeeker struct { + io.Reader + io.Seeker + tmp *os.File +} + +func (tfs *tempFileSeeker) Close() error { + tfs.tmp.Close() + return os.Remove(tfs.tmp.Name()) +} + +// TempFileSeeker converts the provided Reader into a ReadSeekCloser +// by using an underlying temporary file. Callers should call the Close +// function when they're done with the TempFileSeeker, to release + +// clean up the temporary file. +func TempFileSeeker(r io.Reader) (io.ReadSeekCloser, error) { + tmp, err := os.CreateTemp(os.TempDir(), "gotosocial-") + if err != nil { + return nil, err + } + + if _, err := io.Copy(tmp, r); err != nil { + return nil, err + } + + return &tempFileSeeker{ + Reader: tmp, + Seeker: tmp, + tmp: tmp, + }, nil +} |