Skip to content

Commit

Permalink
[BUGFIX] Copy metadata on copy file
Browse files Browse the repository at this point in the history
When copy a file corresponding metadata
are now also copied, preserving existing
properties like "file" or "uid".

Resolves: #70934
Releases: main, 12.4, 11.5
Change-Id: Ifbc15b1ad2f1baaba48edbc5299d3b89e2755a53
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/82837
Tested-by: core-ci <typo3@b13.com>
Reviewed-by: Stefan Bürk <stefan@buerk.tech>
Tested-by: Stefan Bürk <stefan@buerk.tech>
  • Loading branch information
o-ba authored and sbuerk committed Feb 8, 2024
1 parent bd4f2f4 commit d8ffdf0
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 0 deletions.
8 changes: 8 additions & 0 deletions typo3/sysext/core/Classes/Resource/ResourceStorage.php
Expand Up @@ -1972,6 +1972,14 @@ public function copyFile(FileInterface $file, Folder $targetFolder, $targetFileN
}
$newFileObject = $this->getFileByIdentifier($newFileObjectIdentifier);

// In case we deal with a file, also copy corresponding metadata
if ($file instanceof File && $newFileObject !== null) {
$metaDataAspect = $newFileObject->getMetaData();
// Add meta data of file while keeping existing properties like "file", "uid", etc.
$metaDataAspect->add(array_replace($file->getMetaData()->get(), $metaDataAspect->get()));
$metaDataAspect->save();
}

$this->eventDispatcher->dispatch(
new AfterFileCopiedEvent($file, $targetFolder, $newFileObjectIdentifier, $newFileObject)
);
Expand Down
20 changes: 20 additions & 0 deletions typo3/sysext/core/Tests/Functional/Fixtures/sys_file_storage.csv
@@ -0,0 +1,20 @@
"sys_file_storage"
,"uid","pid","name","processingfolder","driver","is_browsable","is_public","is_writable","is_online","configuration"
,1,0,"fileadmin/ (auto-created)","temp/assets/_processed_/","Local",1,1,1,1,"<?xml version=""1.0"" encoding=""utf-8"" standalone=""yes"" ?>
<T3FlexForms>
<data>
<sheet index=""sDEF"">
<language index=""lDEF"">
<field index=""basePath"">
<value index=""vDEF"">fileadmin/</value>
</field>
<field index=""pathType"">
<value index=""vDEF"">relative</value>
</field>
<field index=""caseSensitive"">
<value index=""vDEF"">1</value>
</field>
</language>
</sheet>
</data>
</T3FlexForms>"
Expand Up @@ -18,6 +18,8 @@
namespace TYPO3\CMS\Core\Tests\Functional\Resource;

use TYPO3\CMS\Core\Core\Environment;
use TYPO3\CMS\Core\Resource\File;
use TYPO3\CMS\Core\Resource\ResourceFactory;
use TYPO3\CMS\Core\Resource\StorageRepository;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
Expand Down Expand Up @@ -151,4 +153,30 @@ private function mapToDataSet(array $map): array
});
return $map;
}

/**
* @test
*/
public function copyFileCopiesMetadata(): void
{
$this->importCSVDataSet(__DIR__ . '/../Fixtures/sys_file_storage.csv');
$this->setUpBackendUser(1);
mkdir(Environment::getPublicPath() . '/fileadmin/foo');
file_put_contents(Environment::getPublicPath() . '/fileadmin/foo/bar.txt', 'Temp file');
$subject = GeneralUtility::makeInstance(StorageRepository::class)->findByUid(1);
$fileToCopyMetaData = [
'title' => 'Temp file title',
'description' => 'Temp file description',
];
/** @var File $fileToCopy */
$fileToCopy = GeneralUtility::makeInstance(ResourceFactory::class)->getFileObjectFromCombinedIdentifier('1:/foo/bar.txt');
$fileToCopy->getMetaData()->add($fileToCopyMetaData);
$targetParentFolder = GeneralUtility::makeInstance(ResourceFactory::class)->getFolderObjectFromCombinedIdentifier('1:/');
/** @var File $newFile */
$newFile = $subject->copyFile($fileToCopy, $targetParentFolder);
self::assertNotEquals($fileToCopy->getMetaData()->get()['file'], $newFile->getMetaData()->get()['file']);
self::assertNotEquals($fileToCopy->getMetaData()->get()['uid'], $newFile->getMetaData()->get()['uid']);
self::assertEquals($fileToCopyMetaData['title'], $newFile->getMetaData()->get()['title']);
self::assertEquals($fileToCopyMetaData['description'], $newFile->getMetaData()->get()['description']);
}
}

0 comments on commit d8ffdf0

Please sign in to comment.