diff --git a/src/MediaCollections/Filesystem.php b/src/MediaCollections/Filesystem.php index be3f3f2f6..dc0427186 100644 --- a/src/MediaCollections/Filesystem.php +++ b/src/MediaCollections/Filesystem.php @@ -206,6 +206,13 @@ public function getStream(Media $media) return $this->filesystem->disk($media->disk)->readStream($sourceFile); } + public function getConversionStream(Media $media, string $conversion) + { + $sourceFile = $media->getPathRelativeToRoot($conversion); + + return $this->filesystem->disk($media->conversions_disk)->readStream($sourceFile); + } + public function copyFromMediaLibrary(Media $media, string $targetFile): string { file_put_contents($targetFile, $this->getStream($media)); diff --git a/src/MediaCollections/Models/Media.php b/src/MediaCollections/Models/Media.php index 013e43fa2..2fd6e6a95 100644 --- a/src/MediaCollections/Models/Media.php +++ b/src/MediaCollections/Models/Media.php @@ -77,6 +77,8 @@ class Media extends Model implements Attachable, Htmlable, Responsable 'responsive_images' => 'array', ]; + protected int $streamChunkSize = (1024 * 1024); // default to 1MB chunks. + public function newCollection(array $models = []) { return new MediaCollection($models); @@ -303,6 +305,13 @@ public function hasGeneratedConversion(string $conversionName): bool return $generatedConversions[$conversionName] ?? false; } + public function setStreamChunkSize(int $chunkSize) + { + $this->streamChunkSize = $chunkSize; + + return $this; + } + public function toResponse($request) { return $this->buildResponse($request, 'attachment'); @@ -326,7 +335,10 @@ private function buildResponse($request, string $contentDispositionType) return response()->stream(function () { $stream = $this->stream(); - fpassthru($stream); + while(!feof($stream)) { + echo fread($stream, $this->streamChunkSize); + flush(); + } if (is_resource($stream)) { fclose($stream);