diff --git a/lib/private/Files/ObjectStore/S3ObjectTrait.php b/lib/private/Files/ObjectStore/S3ObjectTrait.php index 89405de2e8e0b..9362609fa5ad2 100644 --- a/lib/private/Files/ObjectStore/S3ObjectTrait.php +++ b/lib/private/Files/ObjectStore/S3ObjectTrait.php @@ -222,7 +222,19 @@ public function writeObjectWithMetaData(string $urn, $stream, array $metaData): // buffer is fully seekable, so use it directly for the small upload $this->writeSingle($urn, $buffer, $metaData); } else { - $loadStream = new Psr7\AppendStream([$buffer, $psrStream]); + if ($psrStream->isSeekable()) { + // If the body is seekable, just rewind the body. + $psrStream->rewind(); + $loadStream = $psrStream; + } else { + // If the body is non-seekable, stitch the rewind the buffer and + // the partially read body together into one stream. This avoids + // unnecessary disk usage and does not require seeking on the + // original stream. + $buffer->rewind(); + $loadStream = new Psr7\AppendStream([$buffer, $psrStream]); + } + $this->writeMultiPart($urn, $loadStream, $metaData); } } else {