summaryrefslogtreecommitdiff
path: root/internal/iotools/io.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/iotools/io.go')
-rw-r--r--internal/iotools/io.go33
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
+}