[TASK] ResourceStorage->addFile() should not delete orig file if requested 22/47422/2
authorChristian Kuhn <lolli@schwarzbu.ch>
Thu, 24 Mar 2016 11:32:58 +0000 (12:32 +0100)
committerChristian Kuhn <lolli@schwarzbu.ch>
Wed, 30 Mar 2016 11:09:59 +0000 (13:09 +0200)
FALs ResourceStorage->addFile() is the main method to populate a locale
file into a FAL storage. Internally, the method calls the assigned and
protected driver of this storage and calls addFile() on the
driver after checking permissions.
The method *always* deletes the local original file after it has been
added to the storage. This is funny, since addFile() should then call
moveFile(), but moveFile() exists and is only thought to move
files between storages and not from non-storage to storage.
The drivers addFile() however already contains an argument that
suppresses the deletion of the original file, but that argument is
not added to addFile() of the storage ...
The patch now adds this argument to the method signature of
ResourceStorage addFile() to mitigate the issue in a fully
backwards compatible way.
Since the patch is non-destructive and low-risk, the
patch is requested for 7.6, too.

Change-Id: I201c7eac10f7d35db5bdff889b3561ad5b1dce8b
Resolves: #70012
Releases: master, 7.6
Reviewed-on: https://review.typo3.org/47422
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
typo3/sysext/core/Classes/Resource/ResourceStorage.php

index 12ea38a..e3f4cb1 100644 (file)
@@ -1143,12 +1143,13 @@ class ResourceStorage implements ResourceStorageInterface
      * @param Folder $targetFolder The target folder where the file should be added
      * @param string $targetFileName The name of the file to be add, If not set, the local file name is used
      * @param string $conflictMode a value of the \TYPO3\CMS\Core\Resource\DuplicationBehavior enumeration
+     * @param bool $removeOriginal if set the original file will be removed after successful operation
      *
      * @throws \InvalidArgumentException
      * @throws Exception\ExistingTargetFileNameException
      * @return FileInterface
      */
-    public function addFile($localFilePath, Folder $targetFolder, $targetFileName = '', $conflictMode = DuplicationBehavior::RENAME)
+    public function addFile($localFilePath, Folder $targetFolder, $targetFileName = '', $conflictMode = DuplicationBehavior::RENAME, $removeOriginal = true)
     {
         $localFilePath = PathUtility::getCanonicalPath($localFilePath);
         // File is not available locally NOR is it an uploaded file
@@ -1168,7 +1169,7 @@ class ResourceStorage implements ResourceStorageInterface
             $targetFileName = $this->getUniqueName($targetFolder, $targetFileName);
         }
 
-        $fileIdentifier = $this->driver->addFile($localFilePath, $targetFolder->getIdentifier(), $targetFileName);
+        $fileIdentifier = $this->driver->addFile($localFilePath, $targetFolder->getIdentifier(), $targetFileName, $removeOriginal);
         $file = ResourceFactory::getInstance()->getFileObjectByStorageAndIdentifier($this->getUid(), $fileIdentifier);
 
         if ($this->autoExtractMetadataEnabled()) {