From 7c05870f7e9f2ca1b7e59b9da63bb4dc91a94b4f Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 12:32:33 +0100 Subject: [PATCH 01/16] Adding tests on appveyor --- appveyor.yml | 39 ++++++++++++++++++ tests/FunctionTest.php | 11 +++++ ...0\273\320\276\320\277\320\276\321\202.png" | Bin 0 -> 13578 bytes 3 files changed, 50 insertions(+) create mode 100644 appveyor.yml create mode 100644 "tests/Resources/\321\205\320\273\320\276\320\277\320\276\321\202.png" diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..05de48e --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,39 @@ +build: false +platform: + - x86 + - x64 + +clone_folder: c:\projects\php-http\multipart-stream-builder + +cache: + - c:\tools\php -> appveyor.yml + +init: + - SET PATH=c:\php;%PATH% + - SET COMPOSER_NO_INTERACTION=1 + - SET PHP=1 + + +install: + - IF EXIST c:\php (SET PHP=0) ELSE (mkdir c:\php) + - cd c:\php + - IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-7.0.0-nts-Win32-VC14-x86.zip + - IF %PHP%==1 7z x php-7.0.0-nts-Win32-VC14-x86.zip -y >nul + - IF %PHP%==1 del /Q *.zip + - IF %PHP%==1 echo @php %%~dp0composer.phar %%* > composer.bat + - IF %PHP%==1 copy /Y php.ini-development php.ini + - IF %PHP%==1 echo max_execution_time=1200 >> php.ini + - IF %PHP%==1 echo date.timezone="UTC" >> php.ini + - IF %PHP%==1 echo extension_dir=ext >> php.ini + - IF %PHP%==1 echo extension=php_openssl.dll >> php.ini + - IF %PHP%==1 echo extension=php_mbstring.dll >> php.ini + - IF %PHP%==1 echo extension=php_fileinfo.dll >> php.ini + - appveyor DownloadFile https://getcomposer.org/composer.phar + - cd c:\projects\thephpleague\flysystem + - mkdir %APPDATA%\Composer + - composer update --prefer-dist --no-progress --ansi + +test_script: + - cd c:\projects\php-http\multipart-stream-builder + - composer test + diff --git a/tests/FunctionTest.php b/tests/FunctionTest.php index e29f97d..ad0356c 100644 --- a/tests/FunctionTest.php +++ b/tests/FunctionTest.php @@ -33,6 +33,17 @@ public function testSupportResources() $this->assertTrue(false !== strpos($multipartStream, 'Content-Type: image/png')); } + public function testResourcesWithRussianNames() + { + $resource = fopen(__DIR__.'/Resources/хлопот.png', 'r'); + + $builder = new MultipartStreamBuilder(); + $builder->addResource('image', $resource); + + $multipartStream = (string) $builder->build(); + $this->assertTrue(false !== strpos($multipartStream, 'Content-Disposition: form-data; name="image"; filename="хлопот.png"')); + } + public function testHeaders() { $builder = new MultipartStreamBuilder(); diff --git "a/tests/Resources/\321\205\320\273\320\276\320\277\320\276\321\202.png" "b/tests/Resources/\321\205\320\273\320\276\320\277\320\276\321\202.png" new file mode 100644 index 0000000000000000000000000000000000000000..d3599f829ca84a5ab974ed64e3cc9429e30e94e9 GIT binary patch literal 13578 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 literal 0 HcmV?d00001 From 0be4fe93c0ac1ea1082d87aeeb60b3a2be529825 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 12:33:48 +0100 Subject: [PATCH 02/16] typo --- appveyor.yml | 2 +- src/MultipartStreamBuilder.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 05de48e..91f805b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -29,7 +29,7 @@ install: - IF %PHP%==1 echo extension=php_mbstring.dll >> php.ini - IF %PHP%==1 echo extension=php_fileinfo.dll >> php.ini - appveyor DownloadFile https://getcomposer.org/composer.phar - - cd c:\projects\thephpleague\flysystem + - cd c:\projects\php-http\multipart-stream-builder - mkdir %APPDATA%\Composer - composer update --prefer-dist --no-progress --ansi diff --git a/src/MultipartStreamBuilder.php b/src/MultipartStreamBuilder.php index cd59b44..c68117f 100644 --- a/src/MultipartStreamBuilder.php +++ b/src/MultipartStreamBuilder.php @@ -121,7 +121,7 @@ private function prepareHeaders($name, StreamInterface $stream, $filename, array if (!$this->hasHeader($headers, 'content-disposition')) { $headers['Content-Disposition'] = sprintf('form-data; name="%s"', $name); if ($hasFilename) { - $headers['Content-Disposition'] .= sprintf('; filename="%s"', pathinfo($filename, PATHINFO_BASENAME)); + $headers['Content-Disposition'] .= sprintf('; filename="%s"', basename($filename)); } } From 8df03fbda3193e047202656c01e373651097edfe Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 12:36:38 +0100 Subject: [PATCH 03/16] Updating test command --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 91f805b..d5baa5d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -35,5 +35,5 @@ install: test_script: - cd c:\projects\php-http\multipart-stream-builder - - composer test + - bin\phpunit.bat --verbose From 8033eda71b00cae3591bfd0724cc36e7d9384c65 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 12:42:00 +0100 Subject: [PATCH 04/16] Updating test command --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index d5baa5d..8d7af73 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -35,5 +35,5 @@ install: test_script: - cd c:\projects\php-http\multipart-stream-builder - - bin\phpunit.bat --verbose + - vendor\bin\phpunit.bat --verbose From 72bd97ebad7427890f006f562839994d47dc909f Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 12:58:07 +0100 Subject: [PATCH 05/16] Updated tests to avoid specify filename --- tests/FunctionTest.php | 14 +++++++++++--- ...5\320\273\320\276\320\277\320\276\321\202.png" | Bin 2 files changed, 11 insertions(+), 3 deletions(-) rename "tests/Resources/\321\205\320\273\320\276\320\277\320\276\321\202.png" => "tests/Resources/NonUtf8/\321\205\320\273\320\276\320\277\320\276\321\202.png" (100%) diff --git a/tests/FunctionTest.php b/tests/FunctionTest.php index ad0356c..77d42ac 100644 --- a/tests/FunctionTest.php +++ b/tests/FunctionTest.php @@ -33,12 +33,20 @@ public function testSupportResources() $this->assertTrue(false !== strpos($multipartStream, 'Content-Type: image/png')); } - public function testResourcesWithRussianNames() + public function testResourcesWithStrangeNames() { - $resource = fopen(__DIR__.'/Resources/хлопот.png', 'r'); + $basePath = __DIR__.'/Resources/NonUtf8'; + $files = scandir($basePath); $builder = new MultipartStreamBuilder(); - $builder->addResource('image', $resource); + foreach ($files as $file) { + if (substr($file, 0, 1) === '.') { + continue; + } + + $builder->addResource('image', fopen($basePath.'/'.$file, 'r')); + } + $multipartStream = (string) $builder->build(); $this->assertTrue(false !== strpos($multipartStream, 'Content-Disposition: form-data; name="image"; filename="хлопот.png"')); diff --git "a/tests/Resources/\321\205\320\273\320\276\320\277\320\276\321\202.png" "b/tests/Resources/NonUtf8/\321\205\320\273\320\276\320\277\320\276\321\202.png" similarity index 100% rename from "tests/Resources/\321\205\320\273\320\276\320\277\320\276\321\202.png" rename to "tests/Resources/NonUtf8/\321\205\320\273\320\276\320\277\320\276\321\202.png" From 32429d8231de33a4efac39af2d27f66941a539c5 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 13:02:18 +0100 Subject: [PATCH 06/16] Specify filename --- tests/FunctionTest.php | 12 ++---------- ...320\273\320\276\320\277\320\276\321\202.png" | Bin 13578 -> 0 bytes 2 files changed, 2 insertions(+), 10 deletions(-) delete mode 100644 "tests/Resources/NonUtf8/\321\205\320\273\320\276\320\277\320\276\321\202.png" diff --git a/tests/FunctionTest.php b/tests/FunctionTest.php index 77d42ac..3a12017 100644 --- a/tests/FunctionTest.php +++ b/tests/FunctionTest.php @@ -35,18 +35,10 @@ public function testSupportResources() public function testResourcesWithStrangeNames() { - $basePath = __DIR__.'/Resources/NonUtf8'; - $files = scandir($basePath); + $resource = fopen(__DIR__.'/Resources/httplug.png', 'r'); $builder = new MultipartStreamBuilder(); - foreach ($files as $file) { - if (substr($file, 0, 1) === '.') { - continue; - } - - $builder->addResource('image', fopen($basePath.'/'.$file, 'r')); - } - + $builder->addResource('image', $resource, ['filename'=>'foo/bar/хлопот.png']); $multipartStream = (string) $builder->build(); $this->assertTrue(false !== strpos($multipartStream, 'Content-Disposition: form-data; name="image"; filename="хлопот.png"')); diff --git "a/tests/Resources/NonUtf8/\321\205\320\273\320\276\320\277\320\276\321\202.png" "b/tests/Resources/NonUtf8/\321\205\320\273\320\276\320\277\320\276\321\202.png" deleted file mode 100644 index d3599f829ca84a5ab974ed64e3cc9429e30e94e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13578 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 From 1923c2ada0ea9be8b7e290f2e35681e0e60e706c Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 13:07:44 +0100 Subject: [PATCH 07/16] throwing in some swedish characters --- tests/FunctionTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/FunctionTest.php b/tests/FunctionTest.php index 3a12017..b0ad503 100644 --- a/tests/FunctionTest.php +++ b/tests/FunctionTest.php @@ -38,10 +38,10 @@ public function testResourcesWithStrangeNames() $resource = fopen(__DIR__.'/Resources/httplug.png', 'r'); $builder = new MultipartStreamBuilder(); - $builder->addResource('image', $resource, ['filename'=>'foo/bar/хлопот.png']); + $builder->addResource('image', $resource, ['filename'=>'foo/bar/хлоäпот.png']); $multipartStream = (string) $builder->build(); - $this->assertTrue(false !== strpos($multipartStream, 'Content-Disposition: form-data; name="image"; filename="хлопот.png"')); + $this->assertTrue(false !== strpos($multipartStream, 'Content-Disposition: form-data; name="image"; filename="хлоöпот.png"')); } public function testHeaders() From da3ee1995479fd1104bd48ef6c892ba339485bad Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 13:10:58 +0100 Subject: [PATCH 08/16] and some greek --- tests/FunctionTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/FunctionTest.php b/tests/FunctionTest.php index b0ad503..746b0d9 100644 --- a/tests/FunctionTest.php +++ b/tests/FunctionTest.php @@ -38,10 +38,10 @@ public function testResourcesWithStrangeNames() $resource = fopen(__DIR__.'/Resources/httplug.png', 'r'); $builder = new MultipartStreamBuilder(); - $builder->addResource('image', $resource, ['filename'=>'foo/bar/хлоäпот.png']); + $builder->addResource('image', $resource, ['filename'=>'foo/bar/хлопотäκόσμε.png']); $multipartStream = (string) $builder->build(); - $this->assertTrue(false !== strpos($multipartStream, 'Content-Disposition: form-data; name="image"; filename="хлоöпот.png"')); + $this->assertTrue(false !== strpos($multipartStream, 'Content-Disposition: form-data; name="image"; filename="хлопотäκόσμε.png"')); } public function testHeaders() From 7d88df5e3e39e26e1b86cdc73a6599b387061acd Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 13:50:43 +0100 Subject: [PATCH 09/16] =?UTF-8?q?test=20with=20=C3=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/FunctionTest.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/FunctionTest.php b/tests/FunctionTest.php index 746b0d9..d1a311f 100644 --- a/tests/FunctionTest.php +++ b/tests/FunctionTest.php @@ -35,13 +35,16 @@ public function testSupportResources() public function testResourcesWithStrangeNames() { - $resource = fopen(__DIR__.'/Resources/httplug.png', 'r'); + $originalLocale = setlocale(LC_ALL, "0"); + setlocale(LC_ALL, 'C'); + $resource = fopen(__DIR__.'/Resources/httplug.png', 'r'); $builder = new MultipartStreamBuilder(); - $builder->addResource('image', $resource, ['filename'=>'foo/bar/хлопотäκόσμε.png']); + $builder->addResource('image', $resource, ['filename'=> 'äa.png']); $multipartStream = (string) $builder->build(); - $this->assertTrue(false !== strpos($multipartStream, 'Content-Disposition: form-data; name="image"; filename="хлопотäκόσμε.png"')); + $this->assertTrue(false !== mb_strpos($multipartStream, 'Content-Disposition: form-data; name="image"; filename="äa.png"')); + setlocale(LC_ALL, $originalLocale); } public function testHeaders() From 10ce8b0e2ce30a4dc80bd031e3d9544b3a0615fe Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 14:01:56 +0100 Subject: [PATCH 10/16] Applied fix with pathinfo --- src/MultipartStreamBuilder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MultipartStreamBuilder.php b/src/MultipartStreamBuilder.php index c68117f..cd59b44 100644 --- a/src/MultipartStreamBuilder.php +++ b/src/MultipartStreamBuilder.php @@ -121,7 +121,7 @@ private function prepareHeaders($name, StreamInterface $stream, $filename, array if (!$this->hasHeader($headers, 'content-disposition')) { $headers['Content-Disposition'] = sprintf('form-data; name="%s"', $name); if ($hasFilename) { - $headers['Content-Disposition'] .= sprintf('; filename="%s"', basename($filename)); + $headers['Content-Disposition'] .= sprintf('; filename="%s"', pathinfo($filename, PATHINFO_BASENAME)); } } From 49cb1999cd17880f944593058bf84c388fba0ddc Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 14:11:16 +0100 Subject: [PATCH 11/16] Better tests --- src/MultipartStreamBuilder.php | 2 +- tests/FunctionTest.php | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/MultipartStreamBuilder.php b/src/MultipartStreamBuilder.php index cd59b44..c68117f 100644 --- a/src/MultipartStreamBuilder.php +++ b/src/MultipartStreamBuilder.php @@ -121,7 +121,7 @@ private function prepareHeaders($name, StreamInterface $stream, $filename, array if (!$this->hasHeader($headers, 'content-disposition')) { $headers['Content-Disposition'] = sprintf('form-data; name="%s"', $name); if ($hasFilename) { - $headers['Content-Disposition'] .= sprintf('; filename="%s"', pathinfo($filename, PATHINFO_BASENAME)); + $headers['Content-Disposition'] .= sprintf('; filename="%s"', basename($filename)); } } diff --git a/tests/FunctionTest.php b/tests/FunctionTest.php index d1a311f..c6e5632 100644 --- a/tests/FunctionTest.php +++ b/tests/FunctionTest.php @@ -43,6 +43,8 @@ public function testResourcesWithStrangeNames() $builder->addResource('image', $resource, ['filename'=> 'äa.png']); $multipartStream = (string) $builder->build(); + $this->assertTrue(0 < preg_match('|filename="([^"]*?)"|si', $multipartStream, $matches), 'Could not find any filename in output.'); + $this->assertEquals('äa.png', $matches[1]); $this->assertTrue(false !== mb_strpos($multipartStream, 'Content-Disposition: form-data; name="image"; filename="äa.png"')); setlocale(LC_ALL, $originalLocale); } From ac1ca498da725eaeef23ea822acdc598d48c4e3f Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 14:16:49 +0100 Subject: [PATCH 12/16] disable weird locale --- tests/FunctionTest.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/FunctionTest.php b/tests/FunctionTest.php index c6e5632..f3c7edf 100644 --- a/tests/FunctionTest.php +++ b/tests/FunctionTest.php @@ -35,8 +35,11 @@ public function testSupportResources() public function testResourcesWithStrangeNames() { + // Get current locale $originalLocale = setlocale(LC_ALL, "0"); - setlocale(LC_ALL, 'C'); + + // Set locale to something strange. + //setlocale(LC_ALL, 'C'); $resource = fopen(__DIR__.'/Resources/httplug.png', 'r'); $builder = new MultipartStreamBuilder(); @@ -46,6 +49,8 @@ public function testResourcesWithStrangeNames() $this->assertTrue(0 < preg_match('|filename="([^"]*?)"|si', $multipartStream, $matches), 'Could not find any filename in output.'); $this->assertEquals('äa.png', $matches[1]); $this->assertTrue(false !== mb_strpos($multipartStream, 'Content-Disposition: form-data; name="image"; filename="äa.png"')); + + // Reset the locale setlocale(LC_ALL, $originalLocale); } From 98c9f25955d819dd37478a524dcb5f55909ea989 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 14:17:07 +0100 Subject: [PATCH 13/16] Using pathinfo --- src/MultipartStreamBuilder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MultipartStreamBuilder.php b/src/MultipartStreamBuilder.php index c68117f..cd59b44 100644 --- a/src/MultipartStreamBuilder.php +++ b/src/MultipartStreamBuilder.php @@ -121,7 +121,7 @@ private function prepareHeaders($name, StreamInterface $stream, $filename, array if (!$this->hasHeader($headers, 'content-disposition')) { $headers['Content-Disposition'] = sprintf('form-data; name="%s"', $name); if ($hasFilename) { - $headers['Content-Disposition'] .= sprintf('; filename="%s"', basename($filename)); + $headers['Content-Disposition'] .= sprintf('; filename="%s"', pathinfo($filename, PATHINFO_BASENAME)); } } From 214152e46c52ba0da9da0f4b7042384d5a431260 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 14:26:47 +0100 Subject: [PATCH 14/16] Updated tests --- tests/FunctionTest.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/FunctionTest.php b/tests/FunctionTest.php index f3c7edf..3323bf2 100644 --- a/tests/FunctionTest.php +++ b/tests/FunctionTest.php @@ -33,13 +33,13 @@ public function testSupportResources() $this->assertTrue(false !== strpos($multipartStream, 'Content-Type: image/png')); } - public function testResourcesWithStrangeNames() + public function testResourceFilenameIsNotLocaleAware() { // Get current locale $originalLocale = setlocale(LC_ALL, "0"); // Set locale to something strange. - //setlocale(LC_ALL, 'C'); + setlocale(LC_ALL, 'C'); $resource = fopen(__DIR__.'/Resources/httplug.png', 'r'); $builder = new MultipartStreamBuilder(); @@ -48,7 +48,6 @@ public function testResourcesWithStrangeNames() $multipartStream = (string) $builder->build(); $this->assertTrue(0 < preg_match('|filename="([^"]*?)"|si', $multipartStream, $matches), 'Could not find any filename in output.'); $this->assertEquals('äa.png', $matches[1]); - $this->assertTrue(false !== mb_strpos($multipartStream, 'Content-Disposition: form-data; name="image"; filename="äa.png"')); // Reset the locale setlocale(LC_ALL, $originalLocale); From 241d2728e62569a43b08ab939f172736e3ed5e06 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 14:35:00 +0100 Subject: [PATCH 15/16] Added function to get basename --- src/MultipartStreamBuilder.php | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/MultipartStreamBuilder.php b/src/MultipartStreamBuilder.php index cd59b44..0bcd101 100644 --- a/src/MultipartStreamBuilder.php +++ b/src/MultipartStreamBuilder.php @@ -121,7 +121,7 @@ private function prepareHeaders($name, StreamInterface $stream, $filename, array if (!$this->hasHeader($headers, 'content-disposition')) { $headers['Content-Disposition'] = sprintf('form-data; name="%s"', $name); if ($hasFilename) { - $headers['Content-Disposition'] .= sprintf('; filename="%s"', pathinfo($filename, PATHINFO_BASENAME)); + $headers['Content-Disposition'] .= sprintf('; filename="%s"', $this->basename($filename)); } } @@ -228,4 +228,30 @@ public function setMimetypeHelper(MimetypeHelper $mimetypeHelper) return $this; } + + /** + * Gets the filename from a given path. + * + * PHP's basename() does not properly support streams or filenames beginning with a non-US-ASCII character. + * + * @author Drupal 8.2 + * + * @param string $path + * + * @return string + */ + private function basename($path) { + $separators = '/'; + if (DIRECTORY_SEPARATOR != '/') { + // For Windows OS add special separator. + $separators .= DIRECTORY_SEPARATOR; + } + // Remove right-most slashes when $uri points to directory. + $path = rtrim($path, $separators); + // Returns the trailing part of the $uri starting after one of the directory + // separators. + $filename = preg_match('@[^' . preg_quote($separators, '@') . ']+$@', $path, $matches) ? $matches[0] : ''; + + return $filename; + } } From bbf282b265ddbd430afd46bc413778613da3e1e6 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Thu, 22 Dec 2016 14:38:30 +0100 Subject: [PATCH 16/16] style fix --- src/MultipartStreamBuilder.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/MultipartStreamBuilder.php b/src/MultipartStreamBuilder.php index 0bcd101..5a62d75 100644 --- a/src/MultipartStreamBuilder.php +++ b/src/MultipartStreamBuilder.php @@ -240,7 +240,8 @@ public function setMimetypeHelper(MimetypeHelper $mimetypeHelper) * * @return string */ - private function basename($path) { + private function basename($path) + { $separators = '/'; if (DIRECTORY_SEPARATOR != '/') { // For Windows OS add special separator. @@ -250,7 +251,7 @@ private function basename($path) { $path = rtrim($path, $separators); // Returns the trailing part of the $uri starting after one of the directory // separators. - $filename = preg_match('@[^' . preg_quote($separators, '@') . ']+$@', $path, $matches) ? $matches[0] : ''; + $filename = preg_match('@[^'.preg_quote($separators, '@').']+$@', $path, $matches) ? $matches[0] : ''; return $filename; }