diff --git a/lib/private/Files/ObjectStore/S3ObjectTrait.php b/lib/private/Files/ObjectStore/S3ObjectTrait.php index 7f4fa13ad5de0..5942240dd6a72 100644 --- a/lib/private/Files/ObjectStore/S3ObjectTrait.php +++ b/lib/private/Files/ObjectStore/S3ObjectTrait.php @@ -205,7 +205,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 {