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..bbb603953a1 100644 --- a/src/Assets/AssetUploader.php +++ b/src/Assets/AssetUploader.php @@ -80,7 +80,7 @@ protected function getNewExtension() public static function getSafeFilename($string) { - $replacements = [ + $replacements = array_merge([ ' ' => '-', '#' => '-', ':' => '-', @@ -95,7 +95,7 @@ public static function getSafeFilename($string) '%' => '-', "'" => '-', '--' => '-', - ]; + ], config('statamic.assets.additional_filename_replacements', [])); return (string) Str::of(urldecode($string)) ->replace(array_keys($replacements), array_values($replacements)) 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', + [ + ',' => '', + '(' => '', + ')' => '', + '%' => '_', + ], + ], ]; } }