diff --git a/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php b/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php index 66598ef387a5ea25c7e9bb08cec4c4960fa512b3..f2da8343544f6b9178e66d849ea78ac33817cf3b 100644 --- a/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php +++ b/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php @@ -4025,13 +4025,16 @@ class ContentObjectRenderer implements LoggerAwareInterface $imageResource = null; if ($file === 'GIFBUILDER') { $gifCreator = GeneralUtility::makeInstance(GifBuilder::class); - $theImage = ''; if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib']) { $gifCreator->start($fileArray, $this->data); $theImage = $gifCreator->gifBuild(); + if (!empty($theImage)) { + // Use absolute path to retrieve image dimension to mitigate path inconsistency in cli context, + // but use the relative path for further processing. + $imageResource = $gifCreator->getImageDimensions(Environment::getPublicPath() . '/' . $theImage); + $imageResource['origFile'] = $theImage; + } } - $imageResource = $gifCreator->getImageDimensions($theImage); - $imageResource['origFile'] = $theImage; } else { if ($file instanceof File) { $fileObject = $file; diff --git a/typo3/sysext/frontend/Classes/Imaging/GifBuilder.php b/typo3/sysext/frontend/Classes/Imaging/GifBuilder.php index badd559d9e82eb76f71388b24f839091c6b4c2b0..78ac8522e5ee3c331a0c5081f3fc0e5245716f7a 100644 --- a/typo3/sysext/frontend/Classes/Imaging/GifBuilder.php +++ b/typo3/sysext/frontend/Classes/Imaging/GifBuilder.php @@ -346,12 +346,12 @@ class GifBuilder extends GraphicalFunctions // Relative to Environment::getPublicPath() $gifFileName = $this->fileName('assets/images/'); // File exists - if (!file_exists($gifFileName)) { + if (!file_exists(Environment::getPublicPath() . '/' . $gifFileName)) { // Create temporary directory if not done: GeneralUtility::mkdir_deep(Environment::getPublicPath() . '/typo3temp/assets/images/'); // Create file: $this->make(); - $this->output($gifFileName); + $this->output(Environment::getPublicPath() . '/' . $gifFileName); $this->destroy(); } return $gifFileName; diff --git a/typo3/sysext/frontend/Tests/Functional/Imaging/GifBuilderTest.php b/typo3/sysext/frontend/Tests/Functional/Imaging/GifBuilderTest.php index df2e467f1ce00df662400215636d1c6768e20798..2a5bdf344256b2670910c6cad780c8fac8e21928 100644 --- a/typo3/sysext/frontend/Tests/Functional/Imaging/GifBuilderTest.php +++ b/typo3/sysext/frontend/Tests/Functional/Imaging/GifBuilderTest.php @@ -30,6 +30,44 @@ use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase; */ class GifBuilderTest extends FunctionalTestCase { + /** + * Sets up Environment to simulate Composer mode and a cli request + */ + protected function simulateCliRequestInComposerMode(): void + { + Environment::initialize( + Environment::getContext(), + true, + true, + Environment::getProjectPath(), + Environment::getPublicPath() . '/public', + Environment::getVarPath(), + Environment::getConfigPath(), + Environment::getCurrentScript(), + Environment::isWindows() ? 'WINDOWS' : 'UNIX' + ); + } + + /** + * @test + */ + public function buildImageInCommandLineInterfaceAndComposerContext(): void + { + $this->simulateCliRequestInComposerMode(); + + $fileArray = [ + 'XY' => '10,10', + 'format' => 'jpg', + ]; + + $gifBuilder = new GifBuilder(); + $gifBuilder->start($fileArray, []); + $gifFileName = $gifBuilder->gifBuild(); + + self::assertFileDoesNotExist(Environment::getProjectPath() . '/' . $gifFileName); + self::assertFileExists(Environment::getPublicPath() . '/' . $gifFileName); + } + /** * Check hashes of Images overlayed with other images are idempotent * @@ -59,8 +97,10 @@ class GifBuilderTest extends FunctionalTestCase 'quality' => 88, '10' => 'IMAGE', '10.' => [ - 'file.width' => 300, 'file' => $file, + 'file.' => [ + 'width' => 300, + ], ], '30' => 'IMAGE', '30.' => [