From 3755fcccf167951b1b579b491959b87c55542a29 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Fri, 28 Feb 2025 10:11:46 +0100 Subject: [PATCH 1/2] feat(FileUploadHandler): allow to upload multiple files add specific callback "afterUploadsCallback" when multiple files are uploaded --- src/core/Form/FileUploadHandler.php | 52 +++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/src/core/Form/FileUploadHandler.php b/src/core/Form/FileUploadHandler.php index 5dd6c50..d3b68bf 100644 --- a/src/core/Form/FileUploadHandler.php +++ b/src/core/Form/FileUploadHandler.php @@ -20,27 +20,53 @@ class FileUploadHandler return $this; } - public function handleForm(?UploadedFile $uploadedFile, string $path, ?callable $afterUploadCallback = null, bool $keepOriginalFilename = false): void + public function handleForm( + null|array|UploadedFile $uploadedFile, + string $path, + ?callable $afterUploadCallback = null, + ?callable $afterUploadsCallback = null, + bool $keepOriginalFilename = false + ): null|array|string { if (null === $uploadedFile) { - return; + return null; } - $originalFilename = pathinfo($uploadedFile->getClientOriginalName(), PATHINFO_FILENAME); + if (is_array($uploadedFile)) { + $filenames = []; - if ($keepOriginalFilename) { - $filename = $originalFilename.'.'.$uploadedFile->guessExtension(); - } elseif (!is_callable($this->filenameGenerator)) { - $safeFilename = transliterator_transliterate('Any-Latin; Latin-ASCII; [^A-Za-z0-9_] remove; Lower()', $originalFilename); - $filename = date('Ymd-his').$safeFilename.'.'.$uploadedFile->guessExtension(); + foreach ($uploadedFile as $file) { + $filename = $this->handleForm($file, $path, $afterUploadCallback, null, $keepOriginalFilename); + + if ($filename !== null) { + $filenames[] = $filename; + } + } + + if (!empty($filenames) && $afterUploadsCallback) { + $afterUploadsCallback($filenames); + } + + return $filenames; } else { - $filename = call_user_func($this->filenameGenerator, $uploadedFile); - } + $originalFilename = pathinfo($uploadedFile->getClientOriginalName(), PATHINFO_FILENAME); - $uploadedFile->move($path, $filename); + if ($keepOriginalFilename) { + $filename = $originalFilename.'.'.$uploadedFile->guessExtension(); + } elseif (!is_callable($this->filenameGenerator)) { + $safeFilename = transliterator_transliterate('Any-Latin; Latin-ASCII; [^A-Za-z0-9_] remove; Lower()', $originalFilename); + $filename = date('Ymd-his').$safeFilename.'.'.$uploadedFile->guessExtension(); + } else { + $filename = call_user_func($this->filenameGenerator, $uploadedFile); + } - if ($afterUploadCallback) { - $afterUploadCallback($filename); + $uploadedFile->move($path, $filename); + + if ($afterUploadCallback) { + $afterUploadCallback($filename); + } + + return $filename; } } } From 9e1d4a7ae9ef48dec270054d8e0d804e69a30cec Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Fri, 28 Feb 2025 10:12:42 +0100 Subject: [PATCH 2/2] update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed8328c..eac59b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ ## [Unreleased] +### Added +* FileUploadHandler: allow to upload multiple files + ## [v1.25.2] - 2025-02-07 ### Added * allow to set `data-*` attributes on modal