From 3c27a8d786ac3942ef41720ee88fd2f36230feda Mon Sep 17 00:00:00 2001 From: Dimitri Sitchet Tomkeu Date: Fri, 23 May 2025 16:01:02 +0100 Subject: [PATCH 1/2] feat: ajout du middleware `FileViewer` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ce middleware offre une manière simple et pratique de visualiser les fichiers uploadés dans un disque donné --- src/Middlewares/FileViewer.php | 74 ++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/Middlewares/FileViewer.php diff --git a/src/Middlewares/FileViewer.php b/src/Middlewares/FileViewer.php new file mode 100644 index 0000000..9f9ff87 --- /dev/null +++ b/src/Middlewares/FileViewer.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace BlitzPHP\Middlewares; + +use BlitzPHP\Filesystem\Adapters\FilesystemAdapter; +use BlitzPHP\Filesystem\Exceptions\FileNotFoundException; +use BlitzPHP\Filesystem\FilesystemManager; +use BlitzPHP\Http\Request; +use BlitzPHP\Http\Response; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\MiddlewareInterface; +use Psr\Http\Server\RequestHandlerInterface; + +class FileViewer implements MiddlewareInterface +{ + /** + * Chemin d'accès du fichier qu'on souhaite affiché + */ + private string $path = ''; + + private ?FilesystemAdapter $disk = null; + + public function __construct(private FilesystemManager $filesystem, private Response $response) + { + } + + /** + * @param Request $request + */ + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface + { + $config = config('filesystems'); + + if ([] === $config['viewable'] ?? []) { + return $handler->handle($request); + } + + $path = trim(urldecode($request->getPath()), '/'); + [$prefix, $this->path] = explode('/', $path, 2); + + foreach ($config['disks'] as $name => $disk) { + if (str_ends_with(trim($disk['url'], '/'), trim($prefix, '/'))) { + $this->disk = $this->filesystem->disk($name); + break; + } + } + + if (null === $this->disk) { + return $handler->handle($request); + } + + if (! $this->disk->exists($this->path)) { + throw FileNotFoundException::fileNotFound($this->path); + } + + $path = $this->disk->path($this->path); + + if ($request->boolean('download')) { + return $this->response->download($path); + } + + return $this->response->file($path); + } +} From 9dd9d3164d034ccdc8a722d2ae05bac92f093677 Mon Sep 17 00:00:00 2001 From: Dimitri Sitchet Tomkeu Date: Fri, 23 May 2025 16:21:29 +0100 Subject: [PATCH 2/2] fix phpstan errors --- src/Middlewares/FileViewer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Middlewares/FileViewer.php b/src/Middlewares/FileViewer.php index 9f9ff87..1c00540 100644 --- a/src/Middlewares/FileViewer.php +++ b/src/Middlewares/FileViewer.php @@ -41,7 +41,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface { $config = config('filesystems'); - if ([] === $config['viewable'] ?? []) { + if ([] === ($config['viewable'] ?? [])) { return $handler->handle($request); } @@ -50,7 +50,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface foreach ($config['disks'] as $name => $disk) { if (str_ends_with(trim($disk['url'], '/'), trim($prefix, '/'))) { - $this->disk = $this->filesystem->disk($name); + $this->disk = $this->filesystem->disk($name); // @phpstan-ignore-line break; } }