Add WriterTo
diff --git a/private/pkg/storage/storagemem/read_object_closer.go b/private/pkg/storage/storagemem/read_object_closer.go
index 74817ff..c092670 100644
--- a/private/pkg/storage/storagemem/read_object_closer.go
+++ b/private/pkg/storage/storagemem/read_object_closer.go
@@ -16,6 +16,7 @@
 
 import (
 	"bytes"
+	"io"
 
 	"github.com/bufbuild/buf/private/pkg/storage"
 	"github.com/bufbuild/buf/private/pkg/storage/storagemem/internal"
@@ -49,6 +50,13 @@
 	return r.reader.Read(p)
 }
 
+func (r *readObjectCloser) WriteTo(w io.Writer) (int64, error) {
+	if r.closed {
+		return 0, storage.ErrClosed
+	}
+	return r.reader.WriteTo(w)
+}
+
 func (r *readObjectCloser) Close() error {
 	if r.closed {
 		return storage.ErrClosed
diff --git a/private/pkg/storage/storageos/bucket.go b/private/pkg/storage/storageos/bucket.go
index e46cb35..71cf82f 100644
--- a/private/pkg/storage/storageos/bucket.go
+++ b/private/pkg/storage/storageos/bucket.go
@@ -17,6 +17,7 @@
 import (
 	"context"
 	"errors"
+	"io"
 	"io/fs"
 	"os"
 	"path/filepath"
@@ -374,6 +375,11 @@
 	return n, toStorageError(err)
 }
 
+func (r *readObjectCloser) WriteTo(w io.Writer) (int64, error) {
+	n, err := r.file.WriteTo(w)
+	return n, toStorageError(err)
+}
+
 func (r *readObjectCloser) Close() error {
 	return toStorageError(r.file.Close())
 }