diff --git a/typo3/sysext/core/Classes/Resource/ResourceStorage.php b/typo3/sysext/core/Classes/Resource/ResourceStorage.php index 18d36fb3ed5a9cd6326420388f2721e7af138290..9284cf55959d676ce4964efab00a5866cc5dab70 100644 --- a/typo3/sysext/core/Classes/Resource/ResourceStorage.php +++ b/typo3/sysext/core/Classes/Resource/ResourceStorage.php @@ -1106,14 +1106,16 @@ class ResourceStorage { $this->assureFileAddPermissions($localFilePath, $targetFolder, $targetFileName); $targetFolder = $targetFolder ?: $this->getDefaultFolder(); $targetFileName = $this->driver->sanitizeFileName($targetFileName ?: PathUtility::basename($localFilePath)); + + // We do not care whether the file exists yet because $targetFileName may be changed by an + // external slot and only then we should check how to proceed according to $conflictMode + $this->emitPreFileAddSignal($targetFileName, $targetFolder, $localFilePath); + if ($conflictMode === 'cancel' && $this->driver->fileExistsInFolder($targetFileName, $targetFolder->getIdentifier())) { throw new Exception\ExistingTargetFileNameException('File "' . $targetFileName . '" already exists in folder ' . $targetFolder->getIdentifier(), 1322121068); } elseif ($conflictMode === 'changeName') { $targetFileName = $this->getUniqueName($targetFolder, $targetFileName); } - // We do not care whether the file exists if $conflictMode is "replace", - // so just use the name as is in that case - $this->emitPreFileAddSignal($targetFileName, $targetFolder); $fileIdentifier = $this->driver->addFile($localFilePath, $targetFolder->getIdentifier(), $targetFileName); $file = ResourceFactory::getInstance()->getFileObjectByStorageAndIdentifier($this->getUid(), $fileIdentifier); @@ -2094,12 +2096,13 @@ class ResourceStorage { /** * Emits file pre-add signal * - * @param string $fileName + * @param string $targetFileName * @param Folder $targetFolder + * @param string $sourceFilePath * @return void */ - protected function emitPreFileAddSignal($fileName, Folder $targetFolder) { - $this->getSignalSlotDispatcher()->dispatch('TYPO3\\CMS\\Core\\Resource\\ResourceStorage', self::SIGNAL_PreFileAdd, array($fileName, $targetFolder)); + protected function emitPreFileAddSignal(&$targetFileName, Folder $targetFolder, $sourceFilePath) { + $this->getSignalSlotDispatcher()->dispatch('TYPO3\\CMS\\Core\\Resource\\ResourceStorage', self::SIGNAL_PreFileAdd, array(&$targetFileName, $targetFolder, $sourceFilePath, $this, $this->driver)); } /**