From 54fa81461ba4fbf5b67ed71d22b43ea5cc8c8748 Mon Sep 17 00:00:00 2001 From: Shota Hoshino Date: Sun, 24 Dec 2023 16:23:07 +0900 Subject: [PATCH] fix: cleanup temporary files (#37) * fix: temporary filesystem clogging * refactor: remove sf4 compatibility and deprecate obsolete parameter * fix: Keep underlying file instance in UploadedBase64EncodedFile to avoid its phyisical file will be cleaned up --- src/HttpFoundation/File/Base64EncodedFile.php | 7 +++++++ .../File/UploadedBase64EncodedFile.php | 15 ++++++++------- .../File/Base64EncodedFileTest.php | 17 +++++++++++++++++ .../File/UploadedBase64EncodedFileTest.php | 16 ++++++++++++++++ 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/HttpFoundation/File/Base64EncodedFile.php b/src/HttpFoundation/File/Base64EncodedFile.php index 75e3d03..09a9c69 100644 --- a/src/HttpFoundation/File/Base64EncodedFile.php +++ b/src/HttpFoundation/File/Base64EncodedFile.php @@ -90,4 +90,11 @@ private function restoreToTemporary(string $encoded, $strict = true): string return $path; } + + public function __destruct() + { + if (file_exists($this->getPathname())) { + unlink($this->getPathname()); + } + } } diff --git a/src/HttpFoundation/File/UploadedBase64EncodedFile.php b/src/HttpFoundation/File/UploadedBase64EncodedFile.php index d798db6..9dc189e 100644 --- a/src/HttpFoundation/File/UploadedBase64EncodedFile.php +++ b/src/HttpFoundation/File/UploadedBase64EncodedFile.php @@ -10,6 +10,8 @@ */ class UploadedBase64EncodedFile extends UploadedFile { + private Base64EncodedFile $underlying; + /** * @param Base64EncodedFile $file * @param string $originalName @@ -18,13 +20,12 @@ class UploadedBase64EncodedFile extends UploadedFile */ public function __construct(Base64EncodedFile $file, $originalName = '', $mimeType = null, $size = null) { - $method = new \ReflectionMethod(parent::class, '__construct'); - $num = $method->getNumberOfParameters(); - if (5 === $num) { - parent::__construct($file->getPathname(), $originalName ?: $file->getFilename(), $mimeType, null, true); - } else { - // Symfony 4 compatible - parent::__construct($file->getPathname(), $originalName ?: $file->getFilename(), $mimeType, $size, null, true); + parent::__construct($file->getPathname(), $originalName ?: $file->getFilename(), $mimeType, null, true); + + if ($size !== null) { + trigger_error('The $size argument is removed since Symfony 5.0 and we will removed it in 6.0.', E_USER_DEPRECATED); } + + $this->underlying = $file; } } diff --git a/tests/HttpFoundation/File/Base64EncodedFileTest.php b/tests/HttpFoundation/File/Base64EncodedFileTest.php index 77e0dc7..f44bcfd 100644 --- a/tests/HttpFoundation/File/Base64EncodedFileTest.php +++ b/tests/HttpFoundation/File/Base64EncodedFileTest.php @@ -40,4 +40,21 @@ public function testCreateInstanceWithData() $this->assertEquals($rawStrings, file_get_contents($file->getPathname())); $this->assertEquals('txt', pathinfo($file->getPathname(), PATHINFO_EXTENSION)); } + + /** + * @test + */ + public function testCleanupTemporaryFilesOnDestruction() + { + $rawStrings = 'symfony2'; + $file = new Base64EncodedFile(base64_encode($rawStrings)); + + $pathname = $file->getPathname(); + + $this->assertTrue(file_exists($pathname)); + + unset($file); + + $this->assertFalse(file_exists($pathname)); + } } diff --git a/tests/HttpFoundation/File/UploadedBase64EncodedFileTest.php b/tests/HttpFoundation/File/UploadedBase64EncodedFileTest.php index d7f1e9c..cf822aa 100644 --- a/tests/HttpFoundation/File/UploadedBase64EncodedFileTest.php +++ b/tests/HttpFoundation/File/UploadedBase64EncodedFileTest.php @@ -67,6 +67,22 @@ public function testGetError() $this->assertEquals(UPLOAD_ERR_OK, $file->getError()); } + /** + * @test + */ + public function testCleanupTemporaryFilesOnDestruction() + { + $file = $this->getFile('symfony'); + + $pathname = $file->getPathname(); + + $this->assertTrue(file_exists($pathname)); + + unset($file); + + $this->assertFalse(file_exists($pathname)); + } + /** * @param string $content * @param string $filename