From 7c5b265000588bbade4c85fb3dd753625905679b Mon Sep 17 00:00:00 2001 From: edalzell Date: Fri, 20 Mar 2026 16:07:48 -0700 Subject: [PATCH 1/3] Add to the replacement list --- config/assets.php | 11 +++++++++++ src/Assets/AssetUploader.php | 35 +++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/config/assets.php b/config/assets.php index 2618b48e33b..14682945df2 100644 --- a/config/assets.php +++ b/config/assets.php @@ -207,6 +207,17 @@ 'additional_uploadable_extensions' => [], + /* + |-------------------------------------------------------------------------- + | Additional Filename Character Replacements + |-------------------------------------------------------------------------- + | + | When uploading files, replace filenames that contain these characters. + | + */ + + 'additional_filename_replacements' => [], + /* |-------------------------------------------------------------------------- | SVG Sanitization diff --git a/src/Assets/AssetUploader.php b/src/Assets/AssetUploader.php index fa031aa4201..b7017b9e4e6 100644 --- a/src/Assets/AssetUploader.php +++ b/src/Assets/AssetUploader.php @@ -80,22 +80,25 @@ protected function getNewExtension() public static function getSafeFilename($string) { - $replacements = [ - ' ' => '-', - '#' => '-', - ':' => '-', - '<' => '-', - '>' => '-', - '"' => '-', - '/' => '-', - '\\' => '-', - '|' => '-', - '?' => '-', - '*' => '-', - '%' => '-', - "'" => '-', - '--' => '-', - ]; + $replacements = array_merge( + [ + ' ' => '-', + '#' => '-', + ':' => '-', + '<' => '-', + '>' => '-', + '"' => '-', + '/' => '-', + '\\' => '-', + '|' => '-', + '?' => '-', + '*' => '-', + '%' => '-', + "'" => '-', + '--' => '-', + ], + config('statamic.assets.additional_filename_replacements', []) + ); return (string) Str::of(urldecode($string)) ->replace(array_keys($replacements), array_values($replacements)) From 7dac9dc4dfddf071e56784c9e1dc7f7727e134cb Mon Sep 17 00:00:00 2001 From: edalzell Date: Fri, 20 Mar 2026 16:36:08 -0700 Subject: [PATCH 2/3] test --- tests/Assets/AssetUploaderTest.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/Assets/AssetUploaderTest.php b/tests/Assets/AssetUploaderTest.php index 3e2ec8ec5da..6389f16048d 100644 --- a/tests/Assets/AssetUploaderTest.php +++ b/tests/Assets/AssetUploaderTest.php @@ -11,8 +11,9 @@ class AssetUploaderTest extends TestCase { #[Test] #[DataProvider('filenameReplacementsProvider')] - public function it_gets_safe_filename($originalFilename, $expectedFilename) + public function it_gets_safe_filename($originalFilename, $expectedFilename, $config = []) { + config(['statamic.assets.additional_filename_replacements' => $config]); $this->assertEquals($expectedFilename, AssetUploader::getSafeFilename($originalFilename)); } @@ -34,6 +35,16 @@ public static function filenameReplacementsProvider() 'single quote' => ["one'two'three.jpg", 'one-two-three.jpg'], 'double dash' => ['one--two--three.jpg', 'one-two-three.jpg'], 'ascii' => ['fòô-bàř', 'foo-bar'], + 'additional config' => [ + 'one,two%three-(6)', + 'onetwo_three-6', + [ + ',' => '', + '(' => '', + ')' => '', + '%' => '_', + ], + ], ]; } } From 755ccf6867302ee472d1ea80f92b8a83421e722a Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Fri, 20 Mar 2026 22:42:24 -0400 Subject: [PATCH 3/3] =?UTF-8?q?=E2=9C=A8watch=20this=20diff=20disappear=20?= =?UTF-8?q?=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Assets/AssetUploader.php | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/Assets/AssetUploader.php b/src/Assets/AssetUploader.php index b7017b9e4e6..bbb603953a1 100644 --- a/src/Assets/AssetUploader.php +++ b/src/Assets/AssetUploader.php @@ -80,25 +80,22 @@ protected function getNewExtension() public static function getSafeFilename($string) { - $replacements = array_merge( - [ - ' ' => '-', - '#' => '-', - ':' => '-', - '<' => '-', - '>' => '-', - '"' => '-', - '/' => '-', - '\\' => '-', - '|' => '-', - '?' => '-', - '*' => '-', - '%' => '-', - "'" => '-', - '--' => '-', - ], - config('statamic.assets.additional_filename_replacements', []) - ); + $replacements = array_merge([ + ' ' => '-', + '#' => '-', + ':' => '-', + '<' => '-', + '>' => '-', + '"' => '-', + '/' => '-', + '\\' => '-', + '|' => '-', + '?' => '-', + '*' => '-', + '%' => '-', + "'" => '-', + '--' => '-', + ], config('statamic.assets.additional_filename_replacements', [])); return (string) Str::of(urldecode($string)) ->replace(array_keys($replacements), array_values($replacements))